Liên kết HTML góc


840

Tôi đang viết một ứng dụng Angular và tôi có phản hồi HTML tôi muốn hiển thị.

Làm thế nào để làm điều đó? Nếu tôi chỉ đơn giản sử dụng cú pháp ràng buộc {{myVal}}thì nó mã hóa tất cả các ký tự HTML (tất nhiên).

Tôi cần bằng cách nào đó để liên kết innerHTMLcủa a divvới giá trị biến.


Bài đăng liên quan để nhận CSS được xác định trong một thành phần để hoạt động ngay trong stackoverflow
HTML.com/questions/36265026/iêu

1
Tôi kết hợp một phản hồi video để giải thích giải pháp và đưa ra một ví dụ: youtube.com/watch?v=Pem2UXp7TXA
Caleb Grams

Điều gì xảy ra nếu biến giữ thẻ góc hoặc thẻ do người dùng xác định như <span [routerLink] = ['some-router']> link </ span>
G. Muqtada

Câu trả lời:


1337

Cú pháp đúng như sau:

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

Tài liệu tham khảo



14
Có cách nào để tôi có thể buộc angular chạy liên kết của nó với các yếu tố bên trongHTML đó không? Tôi cần sử dụng <a [router-link[="..."> </a> và muốn cung cấp điều đó từ html bên ngoài.
thouliha

4
@thouliha Tôi khuyên bạn nên bắt đầu một bài viết mới liên quan đến câu hỏi của bạn.
prolink007

4
Nó kết xuất chuỗi trong trường hợp của tôi, nhưng làm một cái gì đó để đánh dấu. Có vẻ như đã loại bỏ các thuộc tính trên đánh dấu. Tôi vào ngày 2.4.6
paqogomez

2
@paqogomez Vâng, nó loại bỏ bất cứ thứ gì nó cho là không an toàn
Juan Mendes

312

Chung kết Angular 2.0.0 và Angular 4.0.0

Đối với nội dung an toàn chỉ

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

DOMSanitizer

HTML không an toàn tiềm năng cần được đánh dấu rõ ràng là đáng tin cậy bằng cách sử dụng trình khử trùng Angenses DOM để không loại bỏ các phần có thể không an toàn của nội dung

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

với một đường ống như

@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
  }
}

Xem thêm Trong RC.1, một số kiểu không thể được thêm bằng cú pháp ràng buộc

Và tài liệu: https://angular.io/api/pl platform-browser / TumSanitizer

Cảnh báo an ninh

Tin cậy người dùng thêm HTML có thể gây rủi ro bảo mật. Các tài liệu được đề cập trước đây :

Việc gọi bất kỳ bypassSecurityTrust...API nào sẽ vô hiệu hóa khử trùng tích hợp sẵn của Angular cho giá trị được truyền vào. Kiểm tra và kiểm tra cẩn thận tất cả các giá trị và đường dẫn mã đi vào cuộc gọi này. Đảm bảo mọi dữ liệu người dùng được thoát một cách thích hợp cho bối cảnh bảo mật này. Để biết thêm chi tiết, xem Hướng dẫn bảo mật .

Đánh dấu góc

Cái gì đó như

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

với

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

sẽ không khiến Angular xử lý bất cứ thứ gì cụ thể của Angularfoo . Angular thay thế đánh dấu cụ thể Angular tại thời điểm xây dựng bằng mã được tạo. Đánh dấu thêm vào thời gian chạy sẽ không được xử lý bởi Angular .

Để thêm HTML có chứa đánh dấu dành riêng cho góc (ràng buộc thuộc tính hoặc giá trị, các thành phần, chỉ thị, đường ống, ...), cần phải thêm mô-đun động và biên dịch các thành phần khi chạy. Câu trả lời này cung cấp thêm chi tiết Làm cách nào tôi có thể sử dụng / tạo mẫu động để biên dịch Thành phần động với Angular 2.0?


13
Đây nên là câu trả lời. Hãy chú ý đến hai dòng được nhận xét. Nó thực sự là cái thứ hai xử lý HTML.
paqogomez

8
hãy chắc chắnimport { BrowserModule, DomSanitizer } from '@angular/platform-browser'
paqogomez 20/03/2017

4
Ngoài raimport { Pipe } from '@angular/core'
Appulus

1
Đây là câu trả lời, ngay tại đây! Đã tìm kiếm các chi tiết về những gì trong NG2 thay thế $ SCE của NG1. ;)
jrista

2
Câu trả lời chính xác. Giải quyết vấn đề của tôi. Cảm ơn rất nhiều. Trong trường hợp ai đó không chắc chắn làm thế nào để sử dụng đường ống trong một thành phần (như tôi): angular.io/guide/pipes Chỉ cần thêm nó vào khai báo của bạn trong mô-đun tương ứng và voilá!
Alejandro Nagy

169

[innerHtml] là tùy chọn tuyệt vời trong hầu hết các trường hợp, nhưng nó thất bại với các chuỗi thực sự lớn hoặc khi bạn cần kiểu mã hóa cứng trong html.

Tôi muốn chia sẻ cách tiếp cận khác:

Tất cả những gì bạn cần làm là tạo một div trong tệp html của bạn và cung cấp cho nó một số id:

<div #dataContainer></div>

Sau đó, trong thành phần Angular 2 của bạn, tạo tham chiếu đến đối tượng này (TypeScript tại đây):

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;
    }
}

Sau đó, chỉ cần sử dụng loadDatachức năng để nối một số văn bản vào phần tử html.

Đó chỉ là một cách mà bạn sẽ làm bằng cách sử dụng javascript gốc, nhưng trong môi trường Angular. Tôi không khuyên bạn vì nó làm cho mã trở nên lộn xộn hơn, nhưng đôi khi không có lựa chọn nào khác.

Xem thêm Angular 2 - kiểu bên trongHTML


1
Tôi không thấy sự khác biệt so với các giải pháp khác ngoại trừ việc bạn truy cập các thuộc tính nativeElementtrực tiếp được coi là thực tiễn xấu. Tôi chắc chắn [innerHTML]="..."làm điều tương tự dưới mui xe nhưng theo cách thực hành Angular2 tốt.
Günter Zöchbauer 8/8/2016

1
Đó không phải là cách Angular2 hoạt động. HTML bạn thêm vào các mẫu của các thành phần Angular2 trước tiên được xử lý bởi Angular và chỉ sau đó được thêm vào DOM. Bạn đã thực sự gặp vấn đề với [innerHTML]và chuỗi lớn trong Angular2?
Günter Zöchbauer 8/8/2016

1
Tôi nghĩ rằng điều này nên được báo cáo là lỗi. Cảm ơn đã đăng kết quả của bạn.
Günter Zöchbauer

25
[innerHtml]loại bỏ kiểu dáng được mã hóa cứng trong Html. Để tích hợp trình soạn thảo wysiwyg, tôi đã phải sử dụng phương pháp được liệt kê ở đây.
Jony Adamit

2
Đối với tôi giải pháp này hoạt động để bao gồm một tài liệu SVG nội tuyến, trong khi [innerHTML]phương pháp này thì không.
Jared Phelps

54

Trên angular2@2.0.0-alpha.44:

Html-Binding sẽ không hoạt động khi sử dụng {{interpolation}}, thay vào đó hãy sử dụng "Biểu thức":

không hợp lệ

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

-> ném lỗi (Nội suy thay vì Biểu thức dự kiến)

chính xác

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

-> đây là cách chính xác.

bạn có thể thêm các yếu tố bổ sung vào biểu thức, như:

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

dấu

HTML được thêm bằng cách sử dụng [innerHTML](hoặc được thêm động bằng các phương tiện khác element.appenChild()tương tự hoặc tương tự) sẽ không được Angular xử lý theo bất kỳ cách nào ngoại trừ vệ sinh cho mục đích bảo mật.
Những thứ như vậy chỉ hoạt động khi HTML được thêm tĩnh vào mẫu thành phần. Nếu bạn cần điều này, bạn có thể tạo một thành phần trong thời gian chạy như được giải thích trong Làm cách nào tôi có thể sử dụng / tạo mẫu động để biên dịch Thành phần động với Angular 2.0?


1
Chỉnh sửa sau khi thử lại. Đã tìm thấy giải pháp :)
jvoigt

3
Ví dụ thứ ba không hoạt động. Các biểu hiện không được đánh giá. Đầu ra chỉ đơn giản là chuỗi ... Có cách nào khác để kết hợp tin cậyHTML với các thành phần thẻ khác không?
Kévin Vilela Pinto

25

Sử dụng trực tiếp [InternalHTML] mà không sử dụng trình khử trùng DOM của Angular không phải là một tùy chọn nếu nó chứa nội dung do người dùng tạo. Ống safeHtml được đề xuất bởi @ GünterZöchbauer trong câu trả lời của ông là một cách vệ sinh nội dung. Lệnh sau đây là một lệnh khác:

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);
    }
  }
}

Được sử dụng

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

Tôi đã thử sử dụng nhưng gặp lỗi sau Can't bind to 'safeHtml' since it isn't a known property of 'div'. phiên bản 2.4.4
LearnToday

1
@ObasiObenyOj bạn vẫn có thể làm điều đó mà không cần sử dụng một lệnh riêng nếu là trường hợp giới hạn constructor( private sanitizer: Sanitizer) {} và ràng buộc kết quả vào bất cứ điều gì bạn cần, việc sử dụng ElementRef cũng không được đề xuất.
Vale Steve

22

Vui lòng tham khảo các câu trả lời khác cập nhật hơn.

Điều này làm việc cho tôi: <div innerHTML = "{{ myVal }}"></div>(Angular2, Alpha 33)

Theo một SO khác: Chèn HTML từ máy chủ vào DOM bằng angular2 (thao tác DOM chung trong Angular2) , " Internal -html" tương đương với "ng-bind-html" trong Angular 1.X


Cách chính xác là không có {{}}: <div InternalHTML = "myVal"> </ div>
Christian Benseler

2
Sử dụng cú pháp ràng buộc [property] thay vì {{phép nội suy}}
siêu sáng

Đây chắc chắn là cách sai để làm điều đó và nên bị hạ cấp. Điều này sẽ hiển thị tất cả html của bạn bên trong thuộc tính div!
AsoodAsItGets

11

Chỉ cần đưa ra câu trả lời hoàn chỉnh, nếu nội dung html của bạn nằm trong biến thành phần, bạn cũng có thể sử dụng:

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

10

Tôi xin lỗi nếu tôi thiếu điểm ở đây, nhưng tôi muốn đề xuất một cách tiếp cận khác:

Tôi nghĩ tốt hơn là trả lại dữ liệu thô từ ứng dụng phía máy chủ của bạn và liên kết nó với một mẫu ở phía máy khách. Điều này làm cho các yêu cầu nhanh nhẹn hơn vì bạn chỉ trả lại json từ máy chủ của mình.

Đối với tôi, dường như không có ý nghĩa gì khi sử dụng Angular nếu tất cả những gì bạn đang làm là tìm nạp html từ máy chủ và đưa nó "như hiện tại" vào DOM.

Tôi biết Angular 1.x có ràng buộc html, nhưng tôi chưa thấy đối tác trong Angular 2.0. Họ có thể thêm nó sau mặc dù. Dù sao, tôi vẫn sẽ xem xét một api dữ liệu cho ứng dụng Angular 2.0 của bạn.

Tôi có một vài mẫu ở đây với một số ràng buộc dữ liệu đơn giản nếu bạn quan tâm: http://www.syntaxsuccess.com/viewarticle/angular-2.0-examples


28
Chắc chắn có trường hợp sử dụng mà bạn muốn tìm nạp và hiển thị html thô. Ví dụ: tìm nạp một phần định dạng của bài viết từ xa.
Alexander Chen

2
Một kịch bản thường bị bỏ qua khác là bảo vệ logic nghiệp vụ trong mẫu, đôi khi bạn không muốn người dùng trái phép nhìn thấy logic bạn đang sử dụng để hiển thị thông tin, vì vậy bạn muốn chuẩn bị chế độ xem ở phía máy chủ
Ayyash

2
Ngoài ra, ví dụ, hiển thị một email HTML - điểm / câu hỏi công bằng!
một người yêu dấu

2
Nếu bạn đang thiếu điểm (mà bạn dường như là do chính bạn nhập học), thì tại sao lại gửi phản hồi? Rõ ràng quan điểm của Angular là sử dụng công cụ xem của nó để liên kết và hiển thị dữ liệu. Nhưng xem xét thực tế là có vô số ứng dụng có thể sử dụng ứng dụng Angular, điều thực sự khả thi là một hoặc hai trong số chúng có thể yêu cầu một số dữ liệu cần hiển thị trong ứng dụng của bạn có thể được định dạng HTML, và nó có thể xảy ra trong trường hợp nhà phát triển không có quyền kiểm soát nội dung đó. Nói cách khác ... câu hỏi liên quan.
Gregor

Chúng ta chỉ nên bỏ Angular và sử dụng JQuery vì Jquery thực hiện điều này tốt hơn ...
Simon_Weaver

9

Câu trả lời ngắn đã được cung cấp ở đây rồi: sử dụng <div [innerHTML]="yourHtml">ràng buộc.

Tuy nhiên, phần còn lại của những lời khuyên được đề cập ở đây có thể gây hiểu nhầm. Angular có một cơ chế vệ sinh tích hợp khi bạn liên kết với các thuộc tính như thế. Vì Angular không phải là một thư viện vệ sinh chuyên dụng, nó quá nhiệt tình đối với nội dung đáng ngờ để không gặp bất kỳ rủi ro nào. Ví dụ, nó vệ sinh tất cả nội dung SVG thành chuỗi trống.

Bạn có thể nghe lời khuyên để "vệ sinh" nội dung của mình bằng cách sử dụng DomSanitizerđể đánh dấu nội dung là an toàn với bypassSecurityTrustXXXcác phương pháp. Cũng có những gợi ý sử dụng đường ống để làm điều đó và đường ống đó thường được gọi safeHtml.

Tất cả điều này là sai lệch bởi vì nó thực sự bỏ qua việc vệ sinh , không vệ sinh nội dung của bạn. Đây có thể là một mối quan tâm bảo mật bởi vì nếu bạn từng làm điều này trên nội dung do người dùng cung cấp hoặc trên bất cứ điều gì bạn không chắc chắn - bạn sẽ tự mở cho mình một cuộc tấn công mã độc.

Nếu Angular loại bỏ thứ bạn cần bằng cách khử trùng tích hợp sẵn - những gì bạn có thể làm thay vì vô hiệu hóa thì đó là ủy thác vệ sinh thực tế cho một thư viện chuyên dụng thực hiện tốt nhiệm vụ đó. Ví dụ: DOMPurify.

Tôi đã tạo một thư viện trình bao bọc cho nó để có thể dễ dàng sử dụng với Angular: https://github.com/TinkoffCreditSystems/ng-dompurify

Nó cũng có một đường ống để tuyên bố vệ sinh HTML:

<div [innerHtml]="value | dompurify"></div>

Sự khác biệt đối với các đường ống được đề xuất ở đây là nó thực sự làm vệ sinh thông qua DOMPurify và do đó hoạt động cho SVG.

Một điều cần lưu ý là DOMPurify rất tốt cho việc vệ sinh HTML / SVG, nhưng không phải CSS. Vì vậy, bạn có thể cung cấp trình khử trùng CSS của Angular để xử lý CSS:

import {NgModule, ɵ_sanitizeStyle} from '@angular/core';
import {SANITIZE_STYLE} from '@tinkoff/ng-dompurify';

@NgModule({
    // ...
    providers: [
        {
            provide: SANITIZE_STYLE,
            useValue: ɵ_sanitizeStyle,
        },
    ],
    // ...
})
export class AppModule {}

Đó là ɵtiền tố nội bộ , nhưng đây là cách nhóm Angular sử dụng nó trên các gói của riêng họ. Thư viện đó cũng hoạt động cho Angular Universal và môi trường đổi tên phía máy chủ.


5

Chỉ cần sử dụng [innerHTML]thuộc tính trong HTML của bạn , một cái gì đó như thế này dưới đây:

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

Bạn đã bao giờ có các thuộc tính trong thành phần có chứa một số đánh dấu html hoặc các thực thể mà bạn cần hiển thị trong mẫu của mình chưa? Phép nội suy truyền thống sẽ không hoạt động, nhưng ràng buộc thuộc tính bên trong đến để giải cứu.

Sử dụng {{myVal}} KHÔNG hoạt động như mong đợi! Điều này sẽ không nhận các thẻ HTML như <p>, <strong>v.v. và chỉ chuyển nó dưới dạng chuỗi ...

Hãy tưởng tượng bạn có mã này trong thành phần của bạn:

const myVal:string ='<strong>Stackoverflow</strong> is <em>helpful!</em>'

Nếu bạn sử dụng {{myVal}}, bạn sẽ nhận được điều này trong chế độ xem:

<strong>Stackoverflow</strong> is <em>helpful!</em>

nhưng việc sử dụng [innerHTML]="myVal"làm cho kết quả như mong đợi như thế này:

Stackoverflowhữu ích!


Làm thế nào bạn có thể hiển thị nội dung của bạn nếu bạn muốn nó mà không có div container đó? Điều đó có thể không?
Ε é И

3

Bạn có thể áp dụng nhiều đường ống cho kiểu dáng, liên kết và HTML như sau trong .html

<div [innerHTML]="announcementContent | safeUrl| safeHtml">
                    </div>

và trong ống .ts cho chất khử trùng 'URL'

import { Component, Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({ name: 'safeUrl' })
export class SafeUrlPipe implements PipeTransform {
    constructor(private sanitizer: DomSanitizer) {}
    transform(url) {
        return this.sanitizer.bypassSecurityTrustResourceUrl(url);
    }
}

ống cho chất khử trùng 'HTML'

import { Component, Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({
    name: 'safeHtml'
})
export class SafeHtmlPipe implements PipeTransform {
    constructor(private sanitized: DomSanitizer) {}
    transform(value) {
        return this.sanitized.bypassSecurityTrustHtml(value);
    }
}

điều này sẽ áp dụng cả mà không làm phiền bất kỳ phong cách và sự kiện nhấp vào liên kết


2

 <div [innerHTML]="HtmlPrint"></div><br>

Các innerHtml là một tài sản của HTML Elements, cho phép bạn thiết lập nó html-nội dung chương trình khác. Ngoài ra còn có một thuộc tính bên trong định nghĩa nội dung là văn bản thuần túy.

Khung [attributeName]="value"hộp, bao quanh thuộc tính xác định ràng buộc đầu vào Angular. Điều đó có nghĩa là, giá trị của thuộc tính (trong trường hợp của bạn là InternalHtml) bị ràng buộc với biểu thức đã cho, khi kết quả biểu thức thay đổi, giá trị thuộc tính cũng thay đổi.

Vì vậy, về cơ bản [innerHtml]cho phép bạn liên kết và thay đổi động con-html của phần tử HTML đã cho.


1

Trong Angular 2, bạn có thể thực hiện 3 loại ràng buộc:

  • [property]="expression"-> Bất kỳ thuộc tính html nào cũng có thể liên kết đến một
    biểu thức. Trong trường hợp này, nếu biểu thức thay đổi thuộc tính sẽ cập nhật, nhưng điều này không hoạt động theo cách khác.
  • (event)="expression" -> Khi sự kiện kích hoạt biểu thức thực thi.
  • [(ngModel)]="property"-> Liên kết thuộc tính từ js (hoặc ts) sang html. Bất kỳ cập nhật về tài sản này sẽ được chú ý ở khắp mọi nơi.

Một biểu thức có thể là một giá trị, một thuộc tính hoặc một phương thức. Ví dụ: '4', 'control.var', 'getValue ()'

Ví dụ ở đây


0

Cách để tự động thêm các phần tử vào DOM, như được giải thích trên tài liệu Angular 2, bằng cách sử dụng lớp ViewContainerRef từ @ Angular / core.

Những gì bạn phải làm là khai báo một lệnh sẽ triển khai ViewContainerRef và hoạt động như một trình giữ chỗ trên DOM của bạn.

Chỉ thị

import { Directive, ViewContainerRef } from '@angular/core';

@Directive({
  selector: '[appInject]'
})
export class InjectDirective {

  constructor(public viewContainerRef: ViewContainerRef) { }

}

Sau đó, trong mẫu mà bạn muốn tiêm thành phần:

HTML

<div class="where_you_want_to_inject">    
  <ng-template appInject></ng-template>
</div>

Sau đó, từ mã thành phần được chèn, bạn sẽ tiêm thành phần có chứa HTML bạn muốn:

import { Component, OnInit, ViewChild, ComponentFactoryResolver } from '@angular/core';
import { InjectDirective } from '../inject.directive';
import { InjectedComponent } from '../injected/injected.component';

@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html',
  styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {

  @ViewChild(InjectDirective) injectComp: InjectDirective;

  constructor(private _componentFactoryResolver: ComponentFactoryResolver) {
  }

  ngOnInit() {
  }

  public addComp() {
    const componentFactory = this._componentFactoryResolver.resolveComponentFactory(InjectedComponent);
    const viewContainerRef = this.injectComp.viewContainerRef;
    const componentRef = viewContainerRef.createComponent(componentFactory);
  }

  public removeComp() {
    const componentFactory = this._componentFactoryResolver.resolveComponentFactory(InjectedComponent);
    const viewContainerRef = this.injectComp.viewContainerRef;
    const componentRef = viewContainerRef.remove();
  }

}

Tôi đã thêm một ứng dụng demo hoàn toàn hoạt động trên Angular 2 tự động thêm thành phần vào DOM demo


0

Bạn có thể sử dụng một số phương pháp để đạt được giải pháp. Như đã nói trong câu trả lời đã được phê duyệt, bạn có thể sử dụng:

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

tùy thuộc vào những gì bạn đang cố gắng đạt được, bạn cũng có thể thử những thứ khác như javascript DOM (không được đề xuất, hoạt động DOM chậm):

Trình bày

<div id="test"></test>

Thành phần

var p = document.getElementsById("test");
p.outerHTML = myVal;

Ràng buộc tài sản

Javascript DOM ngoài HTML


Bất kể hoạt động của DOM có chậm hơn góc hay không, thực hiện bằng cách sử dụng getElementsByIdhoặc bất kỳ phương pháp lựa chọn nào khác đều xấu vì nó có thể bắt các phần tử thuộc các thành phần hoàn toàn khác nhau nếu chúng chứa các phần tử có cùng id (hoặc tiêu chí khác).
Aviad P.

Thêm vào đó, nó hoàn toàn thực hiện bên ngoài bất kỳ khu vực góc nào để thay đổi sẽ không được chọn.
Philipp Meissner

0

Chúng tôi luôn có thể chuyển nội dung html sang thuộc innerHTMLtính để hiển thị nội dung động html nhưng nội dung html động đó cũng có thể bị nhiễm hoặc độc hại. Vì vậy, trước khi chuyển nội dung động cho innerHTMLchúng tôi phải luôn đảm bảo nội dung được vệ sinh (sử dụng DOMSanitizer) để chúng tôi có thể thoát khỏi tất cả nội dung độc hại.

Hãy thử đường ống dưới đây:

import { Pipe, PipeTransform } from "@angular/core";
import { DomSanitizer } from "@angular/platform-browser";

@Pipe({name: 'safeHtml'})
export class SafeHtmlPipe implements PipeTransform {
    constructor(private sanitized: DomSanitizer) {
    }
    transform(value: string) {
        return this.sanitized.bypassSecurityTrustHtml(value);
    }
}

Usage:
<div [innerHTML]="content | safeHtml"></div>

Điều này là cần thiết ngay cả khi bạn có thể nghĩ rằng nó không phải là. Ví dụ, style: background-colortất cả mọi thứ có thể bị loại bỏ và vì vậy tốt nhất là chỉ nên bắt đầu sử dụng nó từ đầu hoặc bạn sẽ rất bối rối sau đó.
Simon_Weaver

Điều tôi hiểu là tập lệnh này là cho phép tất cả nội dung độc hại (bypassSecurityTrustHtml), vì bạn chỉ ra điều này tôi nghĩ rằng đường ống này là không bắt buộc trừ khi bạn tin tưởng vào nguồn. referto: angular.io/api/pl platform
Sae

0

Nếu bạn muốn điều đó trong Angular 2 hoặc Angular 4 và cũng muốn giữ CSS nội tuyến thì bạn có thể sử dụng

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

Điều này đã cho tôi một lỗi `Uncaught (trong lời hứa): Lỗi: Lỗi phân tích mẫu: Không thể tìm thấy đường ống 'keepHtml'
Praveen

nhập {ống, ống dẫn} từ "@ angular / core";
Jay Momaya


0

Làm việc trong Angular v2.1.1

<div [innerHTML]="variable or htmlString">
</div>

2
Điều này tạo ra: <div _ngcontent-luf-0=""></div>cho tôi. Cái divtrống rỗng.
Scott Marcus

-2

Nếu bạn có các mẫu trong ứng dụng góc (hoặc bất kỳ khung nào) và bạn trả về các mẫu HTML từ phụ trợ của bạn thông qua yêu cầu / phản hồi HTTP, bạn đang trộn lẫn các mẫu giữa giao diện và phụ trợ.

Tại sao không chỉ để lại các công cụ tạo khuôn mẫu trong frontend (tôi sẽ đề nghị điều đó), hoặc trong phần phụ trợ (imo intransparent khá)?

Và nếu bạn giữ các mẫu ở lối vào, tại sao không trả lời bằng JSON cho các yêu cầu đến phần phụ trợ. Bạn thậm chí không phải thực hiện cấu trúc RESTful, nhưng việc giữ các mẫu ở một bên giúp mã của bạn minh bạch hơn.

Điều này sẽ trả lại khi người khác phải đối phó với mã của bạn (hoặc thậm chí chính bạn đang nhập lại mã của chính mình sau một thời gian)!

Nếu bạn làm đúng, bạn sẽ có các thành phần nhỏ với các mẫu nhỏ và tốt nhất, nếu mã của bạn là imba, ai đó không biết ngôn ngữ mã hóa sẽ có thể hiểu mẫu và logic của bạn! Vì vậy, ngoài ra, giữ cho các chức năng / phương pháp của bạn nhỏ như bạn có thể. Cuối cùng, bạn sẽ thấy rằng việc duy trì, tái cấu trúc, đánh giá và thêm các tính năng sẽ dễ dàng hơn nhiều so với các hàm / phương thức / lớp lớn và trộn lẫn giữa tạo khuôn mẫu và logic giữa giao diện và phụ trợ - và giữ nhiều logic trong phần phụ trợ nếu giao diện của bạn cần linh hoạt hơn (ví dụ: viết giao diện Android hoặc chuyển sang khung giao diện khác).

Triết lý, người đàn ông :)

ps: bạn không phải thực hiện mã sạch 100%, vì nó rất tốn kém - đặc biệt là nếu bạn phải thúc đẩy các thành viên trong nhóm;) nhưng: bạn nên tìm sự cân bằng tốt giữa cách tiếp cận mã sạch hơn và những gì bạn có (có thể đã khá sạch sẽ)

kiểm tra cuốn sách nếu bạn có thể và để nó đi vào tâm hồn của bạn: https://de.wikipedia.org/wiki/Clean_Code


Đôi khi cần lấy HTML từ phía máy chủ khi bạn đang xử lý API cũ như trong SOAP. Tôi đã làm việc với một dự án của mình với BSC (Sàn giao dịch chứng khoán Bharat) và họ trả lại mã HTML của trang ngân hàng trong khi thực hiện thanh toán. Vì vậy, bạn không thể thay đổi API của họ, bạn đã cập nhật mã của mình cho phù hợp.
Mahendra Waykos

Bạn có thể viết một phần mềm trung gian thường truy vấn api xà phòng và cung cấp các kết quả được trích xuất trong một ổ cắm chẳng hạn. Tiêu thụ và trích xuất thông tin qua xà phòng có thể là một nỗi đau.
Guntram

Trường hợp sử dụng thực sự rõ ràng lớn cho đánh dấu thô là khi đánh dấu của bạn đến từ một CMS và được viết trong trình soạn thảo WYSIWYG. Bạn có thể đang phục vụ nhiều điểm cuối từ một CMS không đầu chẳng hạn. Loại điều này là lý do tại sao mọi công cụ tạo khuôn mẫu có một tùy chọn cho đánh dấu thô.
gburton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.