angularjs换行过滤器没有其他html

Meg*_*Hit 85 html javascript sanitization angularjs

我正在尝试将换行符(\n)转换为html br.
根据谷歌集团的讨论,这是我得到的:

myApp.filter('newlines', function () {
    return function(text) {
        return text.replace(/\n/g, '<br/>');
    }
});
Run Code Online (Sandbox Code Playgroud)

那里的讨论还建议在视图中使用以下内容:

{{ dataFromModel | newline | html }}
Run Code Online (Sandbox Code Playgroud)

这似乎是使用旧的html过滤器,而现在我们应该使用该ng-bind-html属性.


无论如何,这会产生一个问题:我不希望原始字符串(dataFromModel)中的任何HTML 呈现为HTML; 只有br的.

例如,给定以下字符串:

虽然7> 5
我仍然不想在这里使用html和东西......

我希望它输出:

While 7 &gt; 5<br>I still don't want html &amp; stuff in here...
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个目标?

Dev*_*ski 276

也许你只能用html实现这一点,一种<preformated text>方式?它将避免使用过滤器或进行任何处理.

您所要做的就是在具有此CSS的元素中显示文本:

<p style="white-space: pre;">{{ MyMultiLineText}}</p>
Run Code Online (Sandbox Code Playgroud)

这将解析并显示\n作为新行.对我来说很棒.

这里是一个jsFiddle示例.

  • 前线,对我来说是一个更好的选择. (79认同)
  • style ="white-space:pre-line;" 在我看来,在<div>中使用是更好的选择 (13认同)
  • +1,这是迄今为止最简单的解决方案,似乎适合许多需求.实际上,"pre-line"通常可能更好,因为长行将被包装(就像任何基于```的解决方案一样). (7认同)
  • `pre-wrap`似乎是大多数人想要的(不是预先排序):"浏览器保留了空白.文本将在必要时包装,并在[w3schools]的在线休息时间(http://www.w3schools)的.com/cssref/pr_text_white-space.asp) (7认同)
  • 我发现我需要在<p>上使用ng-bind ="MyMultiLineText"来阻止Chrome在我的文字前面添加额外的行 (2认同)

Meg*_*Hit 33

我决定只使用2个过滤器,而不是搞乱新的指令:

App.filter('newlines', function () {
    return function(text) {
        return text.replace(/\n/g, '<br/>');
    }
})
.filter('noHTML', function () {
    return function(text) {
        return text
                .replace(/&/g, '&amp;')
                .replace(/>/g, '&gt;')
                .replace(/</g, '&lt;');
    }
});
Run Code Online (Sandbox Code Playgroud)

然后,在我看来,我将一个管道输入另一个:

<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>
Run Code Online (Sandbox Code Playgroud)

  • @BarthZalewski - 从字符串编译正则表达式时只需要`\\`.使用正则表达式文字时,您不必转义斜杠. (2认同)
  • 此代码不再有效,因为不推荐使用ng-bind-html-unsafe. (2认同)

JJW*_*432 26

一种更简单的方法是制作一个过滤器,将每个文本\n分成一个列表,然后使用`ng-repeat.

过滤器:

App.filter('newlines', function() {
  return function(text) {
    return text.split(/\n/g);
  };
});
Run Code Online (Sandbox Code Playgroud)

并在HTML中:

<span ng-repeat="line in (text | newlines) track by $index">
    <p> {{line}}</p>
    <br>
</span>
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案,但会使用更简单的HTML:`<p ng-repeat ="line in(line.message | newlines)"> {{line}} </ p> (4认同)
  • 很好的答案,但在重复行的情况下更好地使用`track by`,这会引发错误:`line in(text | newlines)track by $ index`. (2认同)

Seb*_*eck 9

如果您不想使用无限字符串销毁布局,请使用pre-line:

<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
Run Code Online (Sandbox Code Playgroud)


jai*_*ime 6

我不知道Angular是否有剥离html的服务,但似乎你需要在传递newlines自定义过滤器之前删除html .我这样做的方法是通过一个自定义no-html指令,它将传递一个范围属性和一个过滤器的名称,以便在删除后应用html

<div no-html="data" post-filter="newlines"></div>
Run Code Online (Sandbox Code Playgroud)

这是实施

app.directive('noHtml', function($filter){
  return function(scope, element, attrs){
    var html = scope[attrs.noHtml];
    var text = angular.element("<div>").html(html).text();

    // post filter
    var filter = attrs.postFilter;
    var result = $filter(filter)(text);

    // apending html
    element.html(result);
  };
});
Run Code Online (Sandbox Code Playgroud)

重要的是text变量.在这里,我创建一个中间DOM元素,并使用该html方法将其附加到HTML ,然后仅使用该方法检索文本text.这两种方法都是由Angular的简洁版jQuery提供的.

以下部分是应用newline过滤器,使用该$filter服务完成.

在这里查看plunker:http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p = preview