J'essaye de convertir les caractères de nouvelle ligne ( \n
) en html br
.
Selon cette discussion dans le groupe Google , voici ce que j'ai:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
});
La discussion conseille également d'utiliser les éléments suivants dans la vue:
{{ dataFromModel | newline | html }}
Cela semble utiliser l'ancien html
filtre, alors que maintenant nous sommes censés utiliser l' ng-bind-html
attribut.
Quoi qu'il en soit, cela pose un problème: je ne veux pas que le HTML de la chaîne d'origine ( dataFromModel
) soit rendu au format HTML; seulement le br
's.
Par exemple, étant donné la chaîne suivante:
Bien que 7> 5,
je ne veux toujours pas de html et d'autres choses ici ...
Je voudrais qu'il affiche:
While 7 > 5<br>I still don't want html & stuff in here...
Y a-t-il un moyen d'accomplir cela?
la source
pre-line
c'est probablement mieux en général, car les longues lignes seront encapsulées (comme elles le feraient avec toutes les<br>
solutions basées).pre-wrap
semble être ce que la plupart des gens veulent (pas en pré-ligne): "Les espaces blancs sont préservés par le navigateur. Le texte sera enveloppé si nécessaire, et les sauts de ligne" de w3schoolsAu lieu de jouer avec de nouvelles directives, j'ai décidé d'utiliser simplement 2 filtres:
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, '<'); } });
Ensuite, à mon avis, je passe l'un dans l'autre:
<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>
la source
text.replace(/\\n/g, '<br />')
ou même mieuxtext.replace(/(\\r)?\\n/g, '<br />')
Une façon plus simple de faire cela est de créer un filtre qui divise le texte de chacun
\n
dans une liste, puis d'utiliser `ng-repeat.Le filtre:
App.filter('newlines', function() { return function(text) { return text.split(/\n/g); }; });
et dans le html:
<span ng-repeat="line in (text | newlines) track by $index"> <p> {{line}}</p> <br> </span>
la source
<p ng-repeat="line in (line.message | newlines)">{{line}}</p>
track by
en cas de lignes en double, qui soulèveraient une erreur:line in (text | newlines) track by $index
.Si vous ne voulez pas détruire la mise en page avec des chaînes sans fin, utilisez la pré-ligne:
<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
la source
Je ne sais pas si Angular a un service pour supprimer le html, mais il semble que vous deviez supprimer le html avant de passer votre
newlines
filtre personnalisé. La façon dont je le ferais consiste à utiliser uneno-html
directive personnalisée , à laquelle une propriété scope et le nom d'un filtre à appliquer après la suppression duhtml
<div no-html="data" post-filter="newlines"></div>
Voici la mise en œuvre
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); }; });
Le bit important est la
text
variable. Ici, je crée un élément DOM intermédiaire et je lui ajoute le HTML en utilisant lahtml
méthode, puis je ne récupère que le texte avec latext
méthode. Les deux méthodes sont fournies par la version lite d' Angular de jQuery .La partie suivante applique le
newline
filtre, ce qui est fait à l'aide du$filter
service.Vérifiez le plunker ici: http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview
la source
Une mise à jour du filtre avec ng-bind-html serait actuellement:
myApp.filter('newlines', function () { return function(text) { return text.replace(/( )? /g, '<br/>'); } });
et le filtre noHTML n'est plus nécessaire.
La solution d'espace blanc a une faible prise en charge du navigateur: http://caniuse.com/#search=tab-size
la source
Un peu tard à la fête à ce sujet, mais je suggérerais une petite amélioration pour vérifier les chaînes non définies / nulles.
Quelque chose comme:
.filter('newlines', function () { return function(text) { return (text) ? text.replace(/( )? /g, '<br/>') : text; }; })
Ou (un peu plus serré)
.filter('newlines', function () { return function(text) { return (text instanceof String || typeof text === "string") ? text.replace(/( )? /g, '<br/>') : text; }; })
la source