Próbuję przekonwertować znaki nowej linii ( \n
) na html br
.
Zgodnie z tą dyskusją w Grupie Google , oto co mam:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
});
Dyskusja tam również radzi używać w widoku:
{{ dataFromModel | newline | html }}
Wygląda na to, że używany jest stary html
filtr, podczas gdy teraz powinniśmy użyć ng-bind-html
atrybutu.
Niemniej jednak stanowi to problem: nie chcę, aby jakikolwiek kod HTML z oryginalnego ciągu ( dataFromModel
) był renderowany jako HTML; tylko br
's.
Na przykład, biorąc pod uwagę następujący ciąg:
Chociaż 7> 5
nadal nie chcę tutaj html i innych rzeczy ...
Chciałbym, żeby wypisał:
While 7 > 5<br>I still don't want html & stuff in here...
Czy jest jakiś sposób, aby to osiągnąć?
źródło
pre-line
jest prawdopodobnie ogólnie lepsze, ponieważ długie rzędy zostaną zawinięte (tak jak w przypadku wszelkich<br>
rozwiązań bazowych).pre-wrap
wydaje się być tym, czego chce większość ludzi (nie przed wierszem): "Spacja jest zachowywana przez przeglądarkę. Tekst będzie zawijany, gdy będzie to konieczne, i łamanie linii" z w3schoolsZamiast bawić się nowymi dyrektywami, zdecydowałem się po prostu użyć 2 filtrów:
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, '<'); } });
Następnie, moim zdaniem, łączę jeden w drugi:
<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>
źródło
text.replace(/\\n/g, '<br />')
a nawet lepiejtext.replace(/(\\r)?\\n/g, '<br />')
Prostszym sposobem na zrobienie tego jest utworzenie filtru, który dzieli każdy tekst na
\n
listę, a następnie użycie `ng-repeat.Filtr:
App.filter('newlines', function() { return function(text) { return text.split(/\n/g); }; });
aw html:
<span ng-repeat="line in (text | newlines) track by $index"> <p> {{line}}</p> <br> </span>
źródło
<p ng-repeat="line in (line.message | newlines)">{{line}}</p>
track by
w przypadku podwójnych linii, która zgłasza błąd:line in (text | newlines) track by $index
.Jeśli nie chcesz niszczyć układu niekończącymi się ciągami, użyj pre-line:
<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
źródło
Nie wiem, czy Angular ma usługę usuwania html, ale wygląda na to, że musisz usunąć HTML przed przekazaniem
newlines
własnego filtra. Sposób, w jaki bym to zrobił, to poprzez niestandardowąno-html
dyrektywę, do której zostanie przekazana właściwość zakresu i nazwa filtru do zastosowania po usunięciuhtml
<div no-html="data" post-filter="newlines"></div>
Oto implementacja
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); }; });
Ważnym bitem jest
text
zmienna. Tutaj tworzę pośredni element DOM i dołączam do niego kod HTML za pomocąhtml
metody, a następnie pobieram tylko tekst za pomocątext
metody. Obie metody są dostarczane przez lite wersję jQuery w Angular .Następna część to zastosowanie
newline
filtra, które odbywa się za pomocą$filter
usługi.Sprawdź plunker tutaj: http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview
źródło
Aktualizacja filtru z użyciem ng-bind-html wyglądałaby obecnie:
myApp.filter('newlines', function () { return function(text) { return text.replace(/( )? /g, '<br/>'); } });
a filtr noHTML nie jest już wymagany.
rozwiązanie z pustymi przestrzeniami ma niską obsługę przeglądarki: http://caniuse.com/#search=tab-size
źródło
Trochę za późno na imprezę w tej sprawie, ale sugerowałbym niewielką poprawę, aby sprawdzić ciągi niezdefiniowane / zerowe.
Coś jak:
.filter('newlines', function () { return function(text) { return (text) ? text.replace(/( )? /g, '<br/>') : text; }; })
Lub (trochę mocniej)
.filter('newlines', function () { return function(text) { return (text instanceof String || typeof text === "string") ? text.replace(/( )? /g, '<br/>') : text; }; })
źródło