фильтр новой строки 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 &gt; 5<br>I still don't want html &amp; stuff in here...


есть ли способ сделать это?

566   7  

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, '&amp;')
                .replace(/>/g, '&gt;')
                .replace(/</g, '&lt;');
    }
});

затем, на мой взгляд, я трубу один в другой:

<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(/(&#13;)?&#10;/g, '<br/>');
  }
});

и фильтр noHTML больше не требуется.

решение с белым пространством имеет низкую поддержку браузера: http://caniuse.com/#search=tab-size

немного поздно для партии на этом, но я бы предложил небольшое улучшение, чтобы проверить неопределенные / нулевые строки.

что-то типа:

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

или (немного плотнее)

.filter('newlines', function () {
    return function(text) {
        return (text instanceof String || typeof text === "string") ? text.replace(/(&#13;)?&#10;/g, '<br/>') : text;
    };
})

Comments

    Ничего не найдено.