没有其他的HTML的angularjs换行符filter
我试图将换行符( \n
)转换为html br
的。
根据Google小组的讨论,以下是我所得到的结果:
myApp.filter('newlines', function () { return function(text) { return text.replace(/\n/g, '<br/>'); } });
那里的讨论还build议在视图中使用以下内容:
{{ dataFromModel | newline | html }}
这似乎是使用旧的html
filter,而现在我们应该使用ng-bind-html
属性。
无论如何,这会造成一个问题:我不希望任何来自原始string( dataFromModel
)的HTML呈现为HTML; 只有br
的。
例如,给定以下string:
而7> 5
我还是不想在这里的HTML&东西…
我想要它输出:
While 7 > 5<br>I still don't want html & 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, '&') .replace(/>/g, '>') .replace(/</g, '<'); } });
那么,在我看来,我把一个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); }; });
重要的是text
variables。 在这里,我创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(/( )? /g, '<br/>'); } });
并且不再需要noHTMLfilter。
空白的解决scheme是具有较低的浏览器支持: http : //caniuse.com/#search=tab-size