angularjsで改行を保持する


176

私はこの SOの質問を見ました。

以前ng-bind="item.desc"使用している{{item.desc}}ため、使用する代わりに私のコードng-repeat

だから私のコード:

<div ng-repeat="item in items">
  {{item.description}}
</div>

アイテムの説明には\n、レンダリングされない改行が含まれます。

上記{{item.description}}があると仮定して、改行を簡単に表示するにはどうすればよいng-repeatですか?


<pre>タグに入れますか?
2013年

88
でラッパーdivをスタイリングするstyle="white-space:pre-wrap;"
Stewie 2013年

1
@Stewieのコメントは私(AngularJS 1.2.18)にとって完璧に機能し、個々の要素のスタイルをどのように設定するかを明確に示しており(ピラウやポールウェーバーのソリューションとは対照的)、他のように<pre>タグのスタイルを変更する必要はありません提案した。
Andre Holzner、2014年

あなたは正しいです、私は誰もが基本的なCSSを使用して要素にクラスを適用する方法を知っていると思いました。Stewieが彼のコメントを回答として投稿していたとしたら、彼にとってはより良かったでしょう。まるで彼は十分なポイントを持っているかのように見えますが...
Paul Weber

私は同意します、@ Stewieは間違いなく彼のコメントを回答としてフォーマットするべきでした。それは私の問題を完全に修正しました。
CF_HoneyBadger 2015年

回答:


285

@pilauの回答に基づいていますが、受け入れられた回答でさえも改善されていません。

<div class="angular-with-newlines" ng-repeat="item in items">
   {{item.description}}
</div>

/* in the css file or in a style block */
.angular-with-newlines {
    white-space: pre-wrap;
}

これは、指定されたとおりに改行と空白を使用しますが、コンテンツの境界でコンテンツを分割します。ホワイトスペースプロパティの詳細については、以下を参照してください。

https://developer.mozilla.org/en-US/docs/Web/CSS/white-space

改行で改行するだけでなく、テキストの前にある複数のスペースや空白を折りたたむ場合(元のブラウザーの動作と非常によく似ています)、@ aakiが示唆するように使用できます。

white-space: pre-line;

異なるレンダリングモードの素晴らしい比較:http : //meyerweb.com/eric/css/tests/white-space.html


1
IMOは、preのように等幅フォントにスタイルを変更しないため、ここでの最良のソリューションです。
Troels Larsen 2014

1
保存されるテキストの前の空白に注意してください。
シルバーパラディン、2015年

1
あなたがそれを育てたのでpre-line、好ましいものではないでしょうか?これは、HTMLが通常、ノードのテキストコンテンツをレンダリングし、改行を保持する方法に近いです。
2015年

うーん...あなたは正しいです、私がもはやプレラインの代わりにプレラップを選ぶ理由がもうわからないので、プレラインがより良い解決策です。多分ブラウザのプリラインのサポートはそれほど良くありませんか?しかし、これを答えに追加します...レンダリングの比較は次のとおりです
Paul Weber

これは受け入れられる答えになるはずです!pre-line行く方法です。ポールありがとう!
demisx 2015年

126

試してください:

<div ng-repeat="item in items">
  <pre>{{item.description}}</pre>
</div>

<pre>ラッパーはでテキストを印刷します\nテキストとして

また、jsonを印刷する場合は、見栄えを良くするためjsonに次のようなフィルターを使用します。

<div ng-repeat="item in items">
  <pre>{{item.description|json}}</pre>
</div>

Demo

私は@Paul Weberそれwhite-space: pre-wrap;がより良いアプローチであることに同意します、とにかく使用します<pre>-主にいくつかのものをデバッグするための迅速な方法(スタイリングに時間を無駄にしたくない場合)


item.descriptionは\n、最後ではなく、私が知らない領域にあるテキストです。私はpreあなたの編集に基づいて必要があると思います。
Diolor 2013年

29
多くの場合、<pre>タグはテキストを宅配便に変換し、ページのスタイルを壊すため、適切なソリューションではありません。style = "white-space:pre-wrap;" ソリューションはより良いソリューションのようです(少なくとも私の状況では)
CF_HoneyBadger 2015年

1
@CF_HoneyBadgerよく、あなた@pilauの答えは適切なものですが、それは私のものが間違っているという意味ではなく、私が反対票を投じました
Maxim Shoustin

私はすべて\nのをに<br/>変換してみましたが、もちろんこれらのタグはHTMLマークアップとしてレンダリングされていませんでした...このすべての変換があなたのstyle解決策を見つけた後、これは信じられないほどの助けと単純化です...今はしませんすべてのバックエンドデータを変換し続け、ビューでいくつかの変更を加える必要があります...あなたは+1000に値します!
twknab 2017

これはコードでは機能しますが、たとえばユーザーへのメッセージの表示では機能しません。Paulの答えは正しいと思います
Quintonn '27

63

CSSを使うととても簡単です(うまくいくと私は誓います)。

.angular-with-newlines {
  white-space: pre;
}
  • 見て!追加のHTMLタグはありません!

@pilau空白ではなくカンマ(、)が含まれている場合、テキストを折り返したいのですが、どうすればよいですか?
Shylendra Madda 2014

@shylendra私のソリューションはテキストを折り返さず、preタグ内にあるかのように動作します。おそらく別の質問を開きますか?それともあなたのポイントを逃したのですか?
pilau 2014

ブラウザの互換性について疑問に思っていました。このグラフによると、それはすべての主要なブラウザで動作するようです。改行をbrタグで置き換えるよりもはるかに簡単です。ありがとう!スペースを含まないようにコードをフォーマットすることに注意してください。もちろん、それらは表示されます。developer.mozilla.org/en-US/docs/Web/CSS/white-space
Paul Weber

空白を使用する方が良いかもしれません:プリラップ、そうでなければコンテンツはラップしません。
Paul Weber

16

CSSを使用すると、これを簡単に実現できます。

<div ng-repeat="item in items">
<span style="white-space:pre-wrap;"> {{item.description}}</span>
</div>  

または、この目的のためにCSSクラスを作成し、外部CSSファイルから使用できます。


2

まあそれは、あなたがバインド件のデータにしたい場合は、それにフォーマットするいかなるがあってはならない、そうでない場合は依存することができますbind-htmlし、やるdescription.replace(/\\n/g, '<br>') ことを確認、それはあなたがが欲しいものだありません。


1

CSSソリューションは機能しますが、スタイリングを実際に制御することはできません。私の場合、改行の後にもう少しスペースが必要でした。これを処理するために作成したディレクティブ(typescript)は次のとおりです。

function preDirective(): angular.IDirective {
    return {
        restrict: 'C',
        priority: 450,
        link: (scope, el, attr, ctrl) => {
            scope.$watch(
                () => el[0].innerHTML,
                (newVal) => {
                    let lineBreakIndex = newVal.indexOf('\n');
                    if (lineBreakIndex > -1 && lineBreakIndex !== newVal.length - 1 && newVal.substr(lineBreakIndex + 1, 4) != '</p>') {
                        let newHtml = `<p>${replaceAll(el[0].innerHTML, '\n\n', '\n').split('\n').join('</p><p>')}</p>`;
                        el[0].innerHTML = newHtml;
                    }
                }
            )
        }
    };

    function replaceAll(str, find, replace) {
        return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
    }

    function escapeRegExp(str) {
        return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
    }
}

angular.module('app').directive('pre', preDirective);

使用する:

<div class="pre">{{item.description}}</div>

テキストの各部分を<p>タグにラップするだけです。その後、好きなようにスタイルを設定できます。


1

これをあなたのスタイルに追加するだけで、これは私にとってうまくいきます

white-space: pre-wrap

このテキストを入力する<textarea>と、スペースとラインブレーキがある状態で表示されます。

HTML

   <p class="text-style">{{product?.description}}</p>

CSS

.text-style{
    white-space: pre-wrap
}

0

はい、使用した後、<pre>タグを使用するか、ng-bind-html-unsafe http: //docs-angularjs-org-dev.appspot.com/api/ng.directive:ngBindHtmlUnsafe(1.2+を使用している場合はng-bind-htmlを使用)を使用.replace()します変更/n<br />


7
ng-bind-html-unsafeは非推奨
Maxim Shoustin 2013年

0

cssスタイルの "white-space:pre-wrap"を使用するだけで問題ありません。改行と空白が本当に特別なエラーメッセージを処理する必要があるのと同じ問題がありました。データをバインドしていたところにこのインラインを追加したところ、チャームのように機能しました!


0

似たような問題がありました。ここでは他の回答にはそれほど熱心ではありません。なぜなら、これらの回答では改行の動作を簡単にスタイル設定することができないからです。元のデータを制御できるかどうかはわかりませんが、私が採用した解決策は、「項目」を文字列の配列から配列の配列に切り替えることでした。 。そうすれば、次のようなことができます。

<div ng-repeat="item in items">
  <p ng-repeat="para in item.description">
     {{para}}
  </p>
</div>

このようにして、クラスを段落に適用し、CSSを使用してスタイルを整えることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.