Estou tentando converter caracteres de nova linha ( \n
) em html br
.
De acordo com esta discussão no Grupo do Google , aqui está o que tenho:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
});
A discussão lá também recomenda usar o seguinte na visualização:
{{ dataFromModel | newline | html }}
Parece html
que estamos usando o filtro antigo , mas agora devemos usar o ng-bind-html
atributo.
Independentemente disso, isso representa um problema: não quero que nenhum HTML da string original ( dataFromModel
) seja renderizado como HTML; apenas o br
's.
Por exemplo, dada a seguinte string:
Enquanto 7> 5
eu ainda não quero html e outras coisas aqui ...
Eu gostaria que ele gerasse:
While 7 > 5<br>I still don't want html & stuff in here...
Existe alguma maneira de conseguir isso?
fonte
pre-line
é provavelmente melhor em geral, uma vez que linhas longas serão quebradas (como fariam com qualquer<br>
solução baseada).pre-wrap
parece ser o que a maioria das pessoas deseja (não pré-linha): "O espaço em branco é preservado pelo navegador. O texto será quebrado quando necessário e quebras de linha" de w3schoolsEm vez de mexer com novas diretivas, decidi usar apenas 2 filtros:
Então, na minha opinião, eu canalizo um no outro:
fonte
text.replace(/\\n/g, '<br />')
ou ainda melhortext.replace(/(\\r)?\\n/g, '<br />')
Uma maneira mais simples de fazer isso é criar um filtro que divida o texto de cada
\n
um em uma lista e, em seguida, usar `ng-repeat.O filtro:
e no html:
fonte
<p ng-repeat="line in (line.message | newlines)">{{line}}</p>
track by
em caso de linhas duplicadas, o que elevaria um erro:line in (text | newlines) track by $index
.Se você não quiser destruir o layout com strings infinitas, use pre-line:
fonte
Não sei se o Angular tem um serviço para remover html, mas parece que você precisa remover o html antes de passar seu
newlines
filtro personalizado. A maneira como eu faria isso é por meio de umano-html
diretiva personalizada , à qual seria passada uma propriedade de escopo e o nome de um filtro a ser aplicado após a remoção dohtml
Aqui está a implementação
O que importa é a
text
variável. Aqui, crio um elemento DOM intermediário e acrescento a ele o HTML usando ohtml
método e, em seguida, recupero apenas o texto com otext
método. Ambos os métodos são fornecidos pela versão lite do jQuery do Angular .A parte seguinte é a aplicação do
newline
filtro, que é feito usando o$filter
serviço.Verifique o plunker aqui: http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview
fonte
Uma atualização do filtro com ng-bind-html atualmente seria:
e o filtro noHTML não é mais necessário.
solução de espaço em branco está tendo baixo suporte ao navegador: http://caniuse.com/#search=tab-size
fonte
Um pouco tarde para a festa sobre isso, mas eu sugeriria uma pequena melhoria para verificar se há strings indefinidas / nulas.
Algo como:
Ou (um pouco mais apertado)
fonte