Angular 응용 프로그램을 작성 중이며 표시하려는 HTML 응답이 있습니다.
어떻게합니까? 바인딩 구문을 사용하면 {{myVal}}
모든 HTML 문자를 인코딩합니다 (물론).
나는 바인딩 어떻게 든 필요 innerHTML
의를 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 환경에서 사용하는 방법 일뿐입니다. 코드를 더 복잡하게 만들지 않기 때문에 권장하지 않지만 때로는 다른 옵션이 없습니다.
답변
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>