html - Angular 5. 如何动态添加指向包含特定标签的字符串的链接。像 '@'

标签 html string angular typescript anchor

我有一个看起来像这样的模板 View

<div class="post-content">
      <p>{{ post.content }}</p>
</div>

其中 post.content 是一种字符串。

该字符串可能包含也可能不包含一个或多个引用不同用户的@ 标记。示例:“@用户名”。我想让这个标签可以通过链接点击。将其作为 anchor 标记插入:

<a>@username</a>

到目前为止,我已经尝试过手动对它进行字符串操作,并在字符串中插入 anchor 标记。然而,这只是在 View 中显示为纯文本。

我如何在 Angular 5 中解决这个问题?

最佳答案

您必须使用 innerHTML 属性将提供的字符串呈现为 HTML, 所以不是

<p> {{post.content}} </p>

你应该使用

<p [innerHTML]="post.content"></p>

Demo

但是,这个方法是not safe处理不当容易发生XSS,


推荐的方法:使用 DOM Sanitization 创建管道

linkify.pipe.ts

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

@Pipe({
  name: 'linkify'
})
export class LinkifyPipe implements PipeTransform {

  constructor(private _domSanitizer: DomSanitizer) {}

  transform(value: any, args?: any): any {
    return this._domSanitizer.bypassSecurityTrustHtml(this.stylize(value));
  }

  // Modify this method according to your custom logic
  private stylize(text: string): string {
    let stylizedText: string = '';
    if (text && text.length > 0) {
      for (let t of text.split(" ")) {
        if (t.startsWith("@") && t.length>1)
          stylizedText += `<a href="#${t.substring(1)}">${t}</a> `;
        else
          stylizedText += t + " ";
      }
      return stylizedText;
    }
    else return text;
  }

}

你可以根据自己的逻辑修改stylize方法。

用法:

<p [innerHTML]="sample | linkify"></p>

Demo Stackblitz

关于html - Angular 5. 如何动态添加指向包含特定标签的字符串的链接。像 '@',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48449708/

相关文章:

html - 如何在 Angular 中使用多个 <router-outlet>

angular - 如何从CKEditor获取数据?

html - 在转发器中使用 div 标签水平显示

r - 字符串将值拆分为两列,然后将它们连接成一个新列

c - 寻找数组中最大的子列表?

java - java 包含特定字符的字符串数组列表

angular - FormArray 长度不会被 form.reset() 重置

显示当前和+1 日期的 Javascript 时间

javascript - 当我的页面加载速度过快时,如何测试我的加载屏幕?

html - CSS - 旋转边框 - 这可能吗?