保留angularjs中的换行符


176

我已经看到了这个问题。

我的代码而不是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
通过造型包装divstyle="white-space:pre-wrap;"
Stewie 2013年

1
@Stewie的注释对我来说是完美的(AngularJS 1.2.18),它明确显示了如何设置单个元素的样式(与pilau和Paul Weber的解决方案相对),而无需像其他样式一样更改<pre>标记的样式建议。
Andre Holzner 2014年

没错,我假设每个人都知道如何使用基本的CSS并将类应用于元素。如果Stewie发表他的评论作为答案,那对他会更好。尽管似乎他有足够的分数……
保罗·韦伯2015年

我同意,@ Stewie绝对应该将他的评论格式化为答案。它完美地解决了我的问题。
CF_HoneyBadger 2015年

Answers:


284

基于@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/zh-CN/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通常呈现其节点的文本内容并仍保留换行符的方式。
aaki

嗯...您是对的,在不确定为什么我选择预包装而不是预包装后,预包装是更好的解决方案。也许浏览器对预行的支持不是很好?但我将其添加到答案中……这是效果图的比较:meyerweb.com/eric/css/tests/white-space.html
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 Weberwhite-space: pre-wrap;是一个更好的方法,无论如何使用<pre>-主要用于调试某些东西的快速方法(如果您不想在样式上浪费时间)


item.description是文本,该文本包含\n我不知道的区域,而不是末尾。我想我需要pre根据您的编辑。
Diolor 2013年

29
很多时候,<pre>标记不是一个好的解决方案,因为它将文本转换为快递文字并破坏了页面样式。style =“ white-space:pre-wrap;” 解决方案似乎是一个更好的解决方案(至少就我而言)
CF_HoneyBadger 2015年

1
@CF_HoneyBadger好吧,因为您@pilau的回答是正确的,但这并不意味着我的回答是错误的,因此我被
投票

我尝试将所有\n的转换成<br/>s,然后当然这些标记并没有呈现为HTML标记...在所有这些转换找到了您的style解决方案之后,这是一个了不起的帮助和简化...现在我不必须继续转换我所有的后端数据,并在视图中进行一些更改...您应得的+1000!
twknab

例如,这适用于代码,但不适用于向用户显示消息。我认为保罗的答案是正确的
Quintonn

63

CSS非常简单(我发誓,它可以工作)。

.angular-with-newlines {
  white-space: pre;
}
  • 快看 没有额外的HTML标签!

@pilau如果文本包含逗号(,)而不是空格,我想将其换行怎么办?
Shylendra Madda 2014年

@shylendra我的解决方案不包装文本,它使文本的行为就像在pre标签中一样。也许打开另一个问题?还是我错过了你的意思?
pilau 2014年

我想知道浏览器的兼容性。根据此图表,它似乎可以在所有主要浏览器中使用。与用br标签替换换行符相比,这麻烦得多。谢谢!只要注意格式化代码,使其不包含空格,它们就会显示出来。developer.mozilla.org/zh-CN/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解决方案有效,但是您并不能真正控制样式。就我而言,换行后我需要更多的空间。这是我创建的用于处理此指令的指令(打字稿):

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

只需使用CSS样式“空白:预包装”,您就可以开始使用了。我遇到了同样的问题,需要处理换行符和空白确实很特别的错误消息。我只是在绑定数据的地方添加了该内联,它的工作方式就像Charm!


0

我和你有类似的问题。我对其他答案不太感兴趣,因为它们实际上并不允许您非常轻松地设置换行行为的样式。我不确定您是否可以控制原始数据,但是我采用的解决方案是将“项目”从字符串数组切换为数组数组,其中第二个数组中的每个项目都包含一行文本。这样,您可以执行以下操作:

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

这样,您可以将类应用于段落并使用CSS很好地设置样式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.