[angular] 각도 HTML 바인딩

Angular 응용 프로그램을 작성 중이며 표시하려는 HTML 응답이 있습니다.

어떻게합니까? 바인딩 구문을 사용하면 {{myVal}}모든 HTML 문자를 인코딩합니다 (물론).

나는 바인딩 어떻게 든 필요 innerHTML의를 div변수 값으로.



답변

올바른 구문은 다음과 같습니다.

<div [innerHTML]="theHtmlString"></div>

문서 참조


답변

Angular 2.0.0 및 Angular 4.0.0 최종

안전한 콘텐츠를 위해

<div [innerHTML]="myVal"></div>

DOMSanitizer

잠재적 인 안전하지 않은 HTML은 Angulars DOM 소독제를 사용하여 명시 적으로 신뢰할 수있는 것으로 표시되어야하므로 잠재적으로 안전하지 않은 콘텐츠 부분을 제거하지 않습니다

<div [innerHTML]="myVal | safeHtml"></div>

같은 파이프로

@Pipe({name: 'safeHtml'})
export class Safe {
  constructor(private sanitizer:DomSanitizer){}

  transform(style) {
    return this.sanitizer.bypassSecurityTrustHtml(style);
    //return this.sanitizer.bypassSecurityTrustStyle(style);
    // return this.sanitizer.bypassSecurityTrustXxx(style); - see docs
  }
}

참조 어떤 스타일을 바인딩 구문을 사용하여 추가 할 수 없습니다 RC.1에서

그리고 문서 : https://angular.io/api/platform-browser/DomSanitizer

보안 경고

사용자가 추가 한 HTML을 신뢰하면 보안 위험이 발생할 수 있습니다. 앞에서 언급 한 문서 상태 :

bypassSecurityTrust...API를 호출하면 전달 된 값에 대해 Angular의 내장 된 살균이 비활성화됩니다.이 호출에 들어가는 모든 값과 코드 경로를주의 깊게 확인하고 감사하십시오. 이 보안 컨텍스트에 대해 사용자 데이터가 적절하게 이스케이프되었는지 확인하십시오. 자세한 내용은 보안 안내서를 참조하십시오 .

각도 마크 업

같은 것

class FooComponent {
  bar = 'bar';
  foo = `<div>{{bar}}</div>
    <my-comp></my-comp>
    <input [(ngModel)]="bar">`;

<div [innerHTML]="foo"></div>

Angular는에서 Angular 관련 항목을 처리하지 않습니다foo . Angular는 빌드시 Angular 특정 마크 업을 생성 된 코드로 대체합니다. 런타임에 추가 된 마크 업은 Angular에 의해 처리되지 않습니다 .

Angular 관련 마크 업 (속성 또는 값 바인딩, 구성 요소, 지시문, 파이프 등)이 포함 된 HTML을 추가하려면 런타임에 동적 모듈을 추가하고 구성 요소를 컴파일해야합니다. 이 답변은 자세한 내용을 제공합니다. 동적 템플릿을 사용하여 동적 구성 요소를 Angular 2.0으로 컴파일하는 방법은 무엇입니까?


답변

[innerHtml] 대부분의 경우 훌륭한 옵션이지만 실제로 큰 문자열이나 HTML로 하드 코딩 된 스타일링이 필요한 경우 실패합니다.

다른 접근법을 공유하고 싶습니다.

html 파일에 div를 만들고 ID를 지정하기 만하면됩니다.

<div #dataContainer></div>

그런 다음 Angular 2 구성 요소에서이 객체에 대한 참조를 작성하십시오 (TypeScript here).

import { Component, ViewChild, ElementRef } from '@angular/core';

@Component({
    templateUrl: "some html file"
})
export class MainPageComponent {

    @ViewChild('dataContainer') dataContainer: ElementRef;

    loadData(data) {
        this.dataContainer.nativeElement.innerHTML = data;
    }
}

그런 다음 단순히 loadData함수를 사용 하여 html 요소에 텍스트를 추가하십시오.

네이티브 자바 스크립트를 사용하지만 Angular 환경에서 사용하는 방법 일뿐입니다. 코드를 더 복잡하게 만들지 않기 때문에 권장하지 않지만 때로는 다른 옵션이 없습니다.

참조 innerHTML을 유행에 따라 디자인 – 각도 (2)


답변

angular2@2.0.0-alpha.44에서 :

{{interpolation}}사용할 때 HTML 바인딩이 작동하지 않습니다 . 대신 “표현식”을 사용하십시오.

무효

<p [innerHTML]="{{item.anleser}}"></p>

-> 오류 발생 (예상 식 대신 보간)

옳은

<p [innerHTML]="item.anleser"></p>

-> 이것이 올바른 방법입니다.

다음과 같이 표현식에 요소를 추가 할 수 있습니다.

<p [innerHTML]="'<b>'+item.anleser+'</b>'"></p>

힌트

보안을 위해 위생 처리를 제외하고 Angular는 HTML을 사용하여 추가 [innerHTML]하거나 다른 방법으로 동적으로 추가 한 HTML을 element.appenChild()처리하지 않습니다.
이러한 작업은 HTML이 구성 요소 템플릿에 정적으로 추가 된 경우에만 작동합니다. 이것이 필요한 경우 동적 템플릿을 어떻게 사용 / 생성하여 Angular 2.0으로 동적 컴포넌트를 컴파일 할 수 있습니까?에 설명 된대로 런타임에 컴포넌트를 작성할 수 있습니다 .


답변

Angular의 DOM 소독제를 사용하지 않고 직접 [innerHTML]을 사용하는 것은 사용자가 만든 컨텐츠를 포함하는 경우 옵션이 아닙니다. @ GünterZöchbauer 가 그의 답변에서 제안한 safeHtml 파이프 는 내용을 살균하는 방법 중 하나입니다. 다음 지시어는 또 다른 지시어입니다.

import { Directive, ElementRef, Input, OnChanges, Sanitizer, SecurityContext,
  SimpleChanges } from '@angular/core';

// Sets the element's innerHTML to a sanitized version of [safeHtml]
@Directive({ selector: '[safeHtml]' })
export class HtmlDirective implements OnChanges {
  @Input() safeHtml: string;

  constructor(private elementRef: ElementRef, private sanitizer: Sanitizer) {}

  ngOnChanges(changes: SimpleChanges): any {
    if ('safeHtml' in changes) {
      this.elementRef.nativeElement.innerHTML =
        this.sanitizer.sanitize(SecurityContext.HTML, this.safeHtml);
    }
  }
}

사용될

<div [safeHtml]="myVal"></div>


답변

최신의 다른 답변을 참조하십시오.

이것은 나를 위해 작동합니다 : <div innerHTML = "{{ myVal }}"></div>(Angular2, Alpha 33)

또 다른 SO : Angular2 (Angular2의 일반적인 DOM 조작)를 사용하여 서버에서 DOM으로 HTML 삽입하기 “inner-html”은 Angular 1.X의 “ng-bind-html”과 같습니다.


답변

완전한 답변을 얻기 위해 HTML 내용이 구성 요소 변수에 있으면 다음을 사용할 수도 있습니다.

<div [innerHTML]=componementVariableThatHasTheHtml></div>