Я пытаюсь преобразовать символы новой строки ( \n
) в HTML br
.
Согласно этому обсуждению в группе Google , вот что у меня есть:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
});
Обсуждение там также советует использовать в представлении следующее:
{{ dataFromModel | newline | html }}
Похоже, здесь используется старый html
фильтр, тогда как теперь мы должны использовать ng-bind-html
атрибут.
Тем не менее, это создает проблему: я не хочу, чтобы какой-либо HTML из исходной строки ( dataFromModel
) отображался как HTML; только br
's.
Например, учитывая следующую строку:
Хотя 7> 5,
я все еще не хочу, чтобы здесь были html и прочее ...
Я бы хотел, чтобы он выводил:
While 7 > 5<br>I still don't want html & stuff in here...
Есть ли способ добиться этого?
источник
pre-line
вероятно, лучше в целом, поскольку длинные строки будут обернуты (как и в случае с любыми<br>
другими решениями).pre-wrap
похоже, это то, чего хочет большинство людей (не перед строкой): «Пробелы сохраняются браузером. Текст будет переноситься при необходимости и при переносеВместо того, чтобы возиться с новыми директивами, я решил использовать 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>
источник
text.replace(/\\n/g, '<br />')
или даже лучшеtext.replace(/(\\r)?\\n/g, '<br />')
Более простой способ сделать это - создать фильтр, который разбивает текст в каждом
\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>
источник
<p ng-repeat="line in (line.message | newlines)">{{line}}</p>
track by
в случае дублирующих линий, которые бы вызвать ошибку:line in (text | newlines) track by $index
.Если вы не хотите разрушать макет бесконечными строками, используйте pre-line:
<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
источник
Я не знаю, есть ли в Angular сервис для удаления html, но кажется, что вам нужно удалить html, прежде чем передавать свой
newlines
собственный фильтр. Я бы сделал это с помощью настраиваемойno-html
директивы, в которую было бы передано свойство области и имя фильтра, который будет применяться после удаления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
источник
Обновление фильтра с помощью ng-bind-html в настоящее время будет следующим:
myApp.filter('newlines', function () { return function(text) { return text.replace(/( )? /g, '<br/>'); } });
и фильтр noHTML больше не требуется.
решение white-space имеет низкую поддержку браузера: http://caniuse.com/#search=tab-size
источник
Немного поздно для вечеринки по этому поводу, но я бы предложил небольшое улучшение для проверки строк undefined / null.
Что-то типа:
.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; }; })
источник