没有其他的HTML的angularjs换行符filter

我试图将换行符( \n )转换为html br的。
根据Google小组的讨论,以下是我所得到的结果:

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

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

 {{ dataFromModel | newline | html }} 

这似乎是使用旧的htmlfilter,而现在我们应该使用ng-bind-html属性。


无论如何,这会造成一个问题:我不希望任何来自原始string( dataFromModel )的HTML呈现为HTML; 只有br的。

例如,给定以下string:

而7> 5
我还是不想在这里的HTML&东西…

我想要它输出:

 While 7 &gt; 5<br>I still don't want html &amp; stuff in here... 

有什么办法可以做到这一点?

也许你可以用html,一个<preformated text>方式实现这一点? 它将避免使用filter或进行任何types的处理。

你所要做的就是在具有这个CSS的元素中显示文本:

 <p style="white-space: pre;">{{ MyMultiLineText}}</p> 

这将parsing并显示\ n作为新行。 对我很好。

这里有一个jsFiddle的例子 。

我决定只使用2个filter,而不是搞乱新的指令。

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

那么,在我看来,我把一个pipe道插进另一个:

 <span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span> 

更简单的方法是制作一个filter,将每个\n的文本分割成一个列表,然后使用`ng-repeat。

filter:

 App.filter('newlines', function() { return function(text) { return text.split(/\n/g); }; }); 

并在html:

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

我不知道,如果Angular有一个服务去除HTML,但似乎你需要在传递你的newlines自定义filter之前删除HTML。 我会这样做的方式是通过一个自定义的no-html指令,这将被传递一个范围属性和一个filter的名称去除后的html

 <div no-html="data" post-filter="newlines"></div> 

这是实施

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

重要的是textvariables。 在这里,我创build一个中间DOM元素,并使用html方法将它附加到HTML中,然后只用text方法检索text 。 这两种方法都是由Angular的精简版jQuery提供的 。

以下部分应用了使用$filter服务完成的newline过滤$filter

检查这里的运动员: http ://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview

目前使用ng-bind-html的filter的更新是:

 myApp.filter('newlines', function () { return function(text) { return text.replace(/(&#13;)?&#10;/g, '<br/>'); } }); 

并且不再需要noHTMLfilter。

空白的解决scheme是具有较低的浏览器支持: http : //caniuse.com/#search=tab-size