фильтр новой строки angularjs без другого html
Я пытаюсь конвертировать символы новой строки (n) в html br ' s.
Согласно это обсуждение в группе Google, вот что у меня есть:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/n/g, '<br/>');
}
});
обсуждение там также советует использовать следующее В представлении:
{{ dataFromModel | newline | html }}
это, кажется, с помощью старого html фильтр, в то время как теперь мы должны использовать .
несмотря на это, это создает проблему: я не хочу, чтобы какой-либо HTML исходная строка (dataFromModel) для отображения в виде HTML; только br ' s.
например, учитывая следующую строку:
в то время как 7 > 5
Я все еще не хочу html и прочее здесь...
Я бы хотел, чтобы он выводил:
While 7 > 5<br>I still don't want html & stuff in here...
есть ли способ сделать это?
7 ответов:
может быть, вы можете достичь этого только с html, a
<preformated text>путь ? Это позволит избежать использования фильтров или сделать какой-либо обработки.все, что вам нужно сделать, это отобразить текст в элементе, который имеет этот CSS:
<p style="white-space: pre;">{{ MyMultiLineText}}</p>это будет анализировать и отображать \n как новые строки. Отлично работает для меня.
здесь пример jsFiddle.
вместо того, чтобы возиться с новыми директивами, я решил просто использовать 2 фильтра:
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, '<'); } });затем, на мой взгляд, я трубу один в другой:
<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>
более простой способ сделать это-сделать фильтр, который разбивает текст на каждой
\nв список, а затем использовать `ng-repeat.фильтр:
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, но, похоже, вам нужно удалить html перед передачей вашего
newlinesпользовательский фильтр. Кстати, я хотел бы сделать это с помощью пользовательскогоno-htmlдиректива, которая будет передана свойство scope и имя фильтра для применения после удаления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переменной. Здесь я создаю промежуточный элемент DOM и добавляю его HTML с помощьюhtmlметод, а затем получить только текст сtextметод. Оба метода предоставляются облегченная версия jQuery от Angular.следующая часть применяет
newlineфильтр, который делается с помощью$filterсервис.Проверьте планкер здесь:http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview
Если вы не хотите уничтожить макет с бесконечными строками, используйте pre-line:
<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
обновление фильтра с ng-bind-html в настоящее время будет:
myApp.filter('newlines', function () { return function(text) { return text.replace(/( )? /g, '<br/>'); } });и фильтр noHTML больше не требуется.
решение с белым пространством имеет низкую поддержку браузера: http://caniuse.com/#search=tab-size
немного поздно для партии на этом, но я бы предложил небольшое улучшение, чтобы проверить неопределенные / нулевые строки.
что-то типа:
.filter('newlines', function () { return function(text) { return (text) ? text.replace(/( )? /g, '<br/>') : text; }; })или (немного плотнее)
.filter('newlines', function () { return function(text) { return (text instanceof String || typeof text === "string") ? text.replace(/( )? /g, '<br/>') : text; }; })
Comments