javascript - Angular 2 - 如何有选择地绑定(bind)包含 HTML 的字符串(一些允许的标签)

标签 javascript html angular bind

我正在我的应用程序中实现一些简单的搜索和突出显示。

所以我的模板中有这个:

<span>{{myContent}}</span>

还有这个myContent变量最初可能包含这样的数据(仅作为 HTML 不安全):

:param: (b (r :a:sync memo :o :idf:3.09 kg;/g/1<>11bwnh :score:0.3

我想做的是提供搜索和突出显示功能,所以我的第一个想法是使用正则表达式替换并将我的内容转换为类似这样的内容(假设搜索 memo):

:param: (b (r :a:sync <span style='background-color: yellow'>memo</span> :o :idf:3.09 kg;/g/1<>11bwnh :score:0.3

但是我遇到了如何安全地渲染它的问题。

我见过有关将包含 HTML 的字符串绑定(bind)到 Angular 模板的其他问题,但最新的一个讨论了使用 [innerHTML]并且您需要信任整个 HTML。

有没有办法告诉 Angular 只信任一组特定的标签?

我想到的另一种方法是将搜索结果分成这样的 block :

chunks = searchAndHighlight(myContent);
// chunks would be:
// [
//  {content: ':param: (b (r :a:sync ', html: false},
//  {content: '<span style='background-color: yellow'>memo</span>', html: true},
//  {content: ' :o :idf:3.09 kg;/g/1<>11bwnh :score:0.3', html: false},
// ]

然后在我的模板中使用类似的内容:

<span *ngFor="let chunk of chunks">
  <span *ngIf="chunk.html" [innerHTML]="chunk.content"></span>
  <span *ngIf="!chunk.html">{{chunk.content}}</span>
</span>

但我担心这可能会降低我的应用程序的性能。我的应用程序实际上显示了一棵巨大的数据树,我在其中对每个节点执行搜索,因此该 Node 组件有数百个副本,每个副本都会呈现一条数据(可能会在搜索结果中突出显示)。

希望我很好地描述了问题并且没有让任何人不知所措。

谢谢!

最佳答案

您可以使用DomSanitizer由 Angular 提供。例如

import { DomSanitizer } from "@angular/platform-browser"; myHtml: any = '<p> Some Paragraph </p>'; constructor(private sanitizer: DomSanitizer){ this.myHtml = this.sanitizer.bypassSecurityTrustHtml(this.myHtml); }

这是如何使 HTML 对于 Angular 而言可信的一些基本示例,您可以在您的场景中使用此方法。

关于javascript - Angular 2 - 如何有选择地绑定(bind)包含 HTML 的字符串(一些允许的标签),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48237018/

相关文章:

javascript - SVG getPointAtLength() 返回无效坐标

javascript - 为什么在下一个列表条目时熔接项目会返回显示?

javascript - 使用 html 和 javascript 的随机数生成器没有给出正确的随机数作为答案

javascript - 如何使 GoogleChart 在 mat-grid 中灵活?

angular - 如何在 Angular 6 中使用模块指定多个组件

javascript - 返回 Google 表格中事件单元格的行

javascript - 如何正确应对Chrome X-XSS-Protection?

html - 如何使用 CSS 类和 ID 选择器

javascript - 知道为什么 knockoutjs 会从页面中删除所有 html 内容吗?

angular - 模块构建失败 : SyntaxError: 'import' and 'export' may appear only with 'sourceType: "module"'