改行文字(\n
)をhtml br
に変換しようとしています。
Googleグループでのこの議論 に従って、ここに私が持っているものがあります:
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/\n/g, '<br/>');
}
});
そこの議論はまた、ビューで次を使用することをお勧めします。
{{ dataFromModel | newline | html }}
これは古いhtml
フィルターを使用しているようですが、今はng-bind-html
属性を使用することになっています。
とにかく、これは問題を引き起こします。元の文字列(dataFromModel
)のHTMLをHTMLとしてレンダリングしたくないのです。 br
のみ。
たとえば、次の文字列を指定します。
7> 5の間
まだここにhtmlやものを入れたくないのですが...
出力したい:
While 7 > 5<br>I still don't want html & stuff in here...
これを達成する方法はありますか?
新しいディレクティブをいじる代わりに、2つのフィルターを使用することにしました。
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, '<');
}
});
次に、私の見解では、一方をもう一方にパイプします:
<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>
おそらく<preformated text>
方法でhtmlでのみこれを達成できますか?フィルターの使用を避けたり、あらゆる種類の処理を行います。
あなたがしなければならないのは、このCSSを持つ要素内のテキストを表示することです:
<p style="white-space: pre;">{{ MyMultiLineText}}</p>
これにより、\ nが解析され、新しい行として表示されます。私には最適です。
ここでは、 jsFiddleの例 です。
これを行う簡単な方法は、各\n
のテキストをリストに分割するフィルターを作成し、 `ng-repeatを使用することです。
フィルター:
App.filter('newlines', function() {
return function(text) {
return text.split(/\n/g);
};
});
そして、HTMLで:
<span ng-repeat="line in (text | newlines) track by $index">
<p> {{line}}</p>
<br>
</span>
無限の文字列でレイアウトを破棄したくない場合は、事前入力を使用します。
<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>
Angularにhtmlを削除するサービスがあるかどうかはわかりませんが、newlines
カスタムフィルターを渡す前にhtmlを削除する必要があるようです。私が行う方法は、カスタムno-html
ディレクティブを使用することです。このディレクティブには、html
を削除した後に適用するスコーププロパティとフィルターの名前が渡されます。
<div no-html="data" post-filter="newlines"></div>
実装は次のとおりです
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);
};
});
重要なビットはtext
変数です。ここでは、中間DOM要素を作成し、html
メソッドを使用してHTMLを追加し、text
メソッドでテキストのみを取得します。両方のメソッドは AngularのjQueryのライトバージョン で提供されます。
次の部分は、$filter
サービスを使用して行われるnewline
フィルターの適用です。
ここでプランカーを確認してください: http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview
現在、ng-bind-htmlを使用したフィルターの更新は次のようになります。
myApp.filter('newlines', function () {
return function(text) {
return text.replace(/( )? /g, '<br/>');
}
});
noHTMLフィルターは不要になりました。
ホワイトスペースソリューションのブラウザサポートが少ない: http://caniuse.com/#search=tab-size
これについては少し遅れましたが、未定義/ヌル文字列をチェックするための小さな改善をお勧めします。
何かのようなもの:
.filter('newlines', function () {
return function(text) {
return (text) ? text.replace(/( )? /g, '<br/>') : text;
};
})
または(少し厳しく)
.filter('newlines', function () {
return function(text) {
return (text instanceof String || typeof text === "string") ? text.replace(/( )? /g, '<br/>') : text;
};
})