J'essaie 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 filtre html
, alors que maintenant nous sommes supposés utiliser l'attribut ng-bind-html
.
Quoi qu’il en soit, cela pose un problème: je ne souhaite pas que le code HTML de la chaîne d'origine (dataFromModel
) soit rendu au format HTML; seulement les br
's.
Par exemple, étant donné la chaîne suivante:
Alors que 7> 5
Je ne veux toujours pas de HTML et d'autres choses ici ...
Je voudrais qu'il soit affiché:
While 7 > 5<br>I still don't want html & stuff in here...
Est-il possible d'accomplir cela?
Au lieu de jouer avec les nouvelles directives, j'ai décidé d'utiliser 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, '<');
}
});
Puis, à mon avis, j'en ai un dans l'autre:
<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>
Peut-être que vous pouvez y parvenir uniquement avec le langage HTML, une méthode <preformated text>
? Cela évitera d'utiliser des filtres ou d'effectuer tout type de traitement.
Tout ce que vous avez à faire est d’afficher le texte dans un élément qui a cette CSS:
<p style="white-space: pre;">{{ MyMultiLineText}}</p>
Ceci analysera et affichera\n comme nouvelles lignes. Ça marche bien pour moi.
Ici, un exemple jsFiddle .
Une méthode plus simple consiste à créer un filtre divisant le texte de chaque \n
dans une liste, puis à 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>
Je ne sais pas si Angular a un service pour supprimer le code HTML, mais il semble que vous deviez supprimer le code HTML avant de transmettre votre filtre personnalisé newlines
. Je le ferais par le biais d'une directive no-html
personnalisée, à laquelle seraient transmises une propriété de portée et le nom d'un filtre à appliquer après la suppression de la variable html
.
<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 variable text
. Ici, je crée un élément DOM intermédiaire et l'ajoute au code HTML à l'aide de la méthode html
, puis ne récupère que le texte avec la méthode text
. Les deux méthodes sont fournies par Angular version allégée de jQuery .
La partie suivante applique le filtre newline
, qui est effectué à l'aide du service $filter
.
Vérifiez le lecteur ici: http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview
Si vous ne voulez pas détruire la mise en page avec des chaînes sans fin, utilisez la commande pre-line:
<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
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 requis.
la solution d’espace blanc a un support de navigateur faible: http://caniuse.com/#search=tab-size
Un peu tard pour la fête à ce sujet, mais je suggérerais une petite amélioration pour vérifier les chaînes non définies/null.
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;
};
})