Saya mencoba untuk mengubah karakter baris baru ( \n
) menjadi html br
.
Sesuai diskusi di Google Grup ini , inilah yang saya dapatkan:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
});
Diskusi di sana juga menyarankan untuk menggunakan yang berikut ini dalam tampilan:
{{ dataFromModel | newline | html }}
Ini sepertinya menggunakan html
filter lama , sedangkan sekarang kita seharusnya menggunakan ng-bind-html
atribut.
Terlepas dari itu, ini menimbulkan masalah: Saya tidak ingin HTML dari string asli ( dataFromModel
) dirender sebagai HTML; hanya br
itu.
Misalnya, diberikan string berikut:
Sementara 7> 5
saya masih tidak ingin html & barang di sini ...
Saya ingin menghasilkan:
While 7 > 5<br>I still don't want html & stuff in here...
Apakah ada cara untuk melakukannya?
sumber
pre-line
mungkin lebih baik secara umum, karena baris panjang akan dibungkus (seperti yang akan dilakukan dengan<br>
solusi berbasis apa pun ).pre-wrap
sepertinya yang diinginkan kebanyakan orang (bukan pra-baris): "Spasi kosong disimpan oleh browser. Teks akan ditutup bila perlu, dan saat jeda baris" dari w3schoolsAlih-alih mengotak-atik arahan baru, saya memutuskan untuk hanya menggunakan 2 filter:
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, '<'); } });
Kemudian, dalam pandangan saya, saya menyalurkan satu ke yang lain:
<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>
sumber
text.replace(/\\n/g, '<br />')
atau bahkan lebih baiktext.replace(/(\\r)?\\n/g, '<br />')
Cara yang lebih sederhana untuk melakukannya adalah dengan membuat filter yang memisahkan teks di masing
\n
- masing menjadi daftar, lalu menggunakan `ng-repeat.Filter:
App.filter('newlines', function() { return function(text) { return text.split(/\n/g); }; });
dan di html:
<span ng-repeat="line in (text | newlines) track by $index"> <p> {{line}}</p> <br> </span>
sumber
<p ng-repeat="line in (line.message | newlines)">{{line}}</p>
track by
dalam kasus duplikat baris, yang akan meningkatkan kesalahan:line in (text | newlines) track by $index
.Jika Anda tidak ingin menghancurkan tata letak dengan string tanpa akhir, gunakan pre-line:
<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
sumber
Saya tidak tahu apakah Angular memiliki layanan untuk menghapus html, tetapi tampaknya Anda perlu menghapus html sebelum meneruskan
newlines
filter kustom Anda . Cara saya melakukannya adalah melaluino-html
arahan khusus , yang akan melewati properti cakupan dan nama filter untuk diterapkan setelah menghapushtml
<div no-html="data" post-filter="newlines"></div>
Berikut implementasinya
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); }; });
Bit yang penting adalah
text
variabelnya. Di sini saya membuat elemen DOM perantara dan menambahkannya ke HTML menggunakanhtml
metode dan kemudian hanya mengambil teks dengantext
metode tersebut. Kedua metode ini disediakan oleh jQuery versi lite Angular .Bagian berikut menerapkan
newline
filter, yang dilakukan dengan menggunakan$filter
layanan.Periksa plunker di sini: http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview
sumber
Pembaruan pada filter dengan ng-bind-html saat ini adalah:
myApp.filter('newlines', function () { return function(text) { return text.replace(/( )? /g, '<br/>'); } });
dan filter noHTML tidak lagi diperlukan.
solusi white-space memiliki dukungan browser yang rendah: http://caniuse.com/#search=tab-size
sumber
Agak terlambat ke pesta tentang ini tetapi saya akan menyarankan perbaikan kecil untuk memeriksa string yang tidak ditentukan / nol.
Sesuatu seperti:
.filter('newlines', function () { return function(text) { return (text) ? text.replace(/( )? /g, '<br/>') : text; }; })
Atau (sedikit lebih ketat)
.filter('newlines', function () { return function(text) { return (text instanceof String || typeof text === "string") ? text.replace(/( )? /g, '<br/>') : text; }; })
sumber