我正在尝试通过可能有多行的 Angularjs 在网页上显示一个字符串。这是我得到的:
<textarea ng-model="StringValue"></textarea>
{{StringValue}}
当您输入文本区域时:
“这是
一个字符串”
你得到:
“这是一个字符串”
你如何得到它,以便文本以与输入相同的方式显示?
我正在尝试通过可能有多行的 Angularjs 在网页上显示一个字符串。这是我得到的:
<textarea ng-model="StringValue"></textarea>
{{StringValue}}
当您输入文本区域时:
“这是
一个字符串”
你得到:
“这是一个字符串”
你如何得到它,以便文本以与输入相同的方式显示?
小心ng-bind-html
- 很容易获得 XSS 注入。
如果您只想显示换行符,页面中没有 XSS,您
可以使用简单的 css-rule: white-space: pre
:
<span style="white-space: pre">{{multilinetext}}</span>
当然,您可以为此创建 css-class:
<style>.pre {white-space: pre}</style>
<span class="pre">{{multilinetext}}</span>
此外,此方法使所有空格可见:前导空格、多个空格制表符等。
这是 HTML 的问题。不是角的。Angular 正在准确地写出你告诉它的内容。
在 HTML 中,在<pre>
标签之外,无穷无尽的空白(返回、制表符、空格等)都被视为一个空白。这就是为什么你需要类似的东西<br/>
,
如果你不使用<pre>
标签块。
因此,请在 HTML 中尝试此操作,以便您了解正在发生的事情:
<h3>Plain DIV</h3>
<div>
Some
text
here
</div>
<h3>Now with non-breaking spaces and line breaks</h3>
<div>
Some<br/>
text<br/>
here<br/>
</div>
<h3>Now with a PRE tag</h3>
<pre>
Some
text
here
</pre>
这是一个演示上述内容的小提琴。
不过,您将需要使用一些自定义类来设置 PRE 标记的样式,以使其看起来像页面上的其他文本,因为大多数默认样式<pre>
将使用等宽(固定宽度)字体,如 Courier 或康索拉斯。
要么就是这样,要么您将不得不编写一个角度过滤器,将空格、制表符和换行符处理成正确的标记。...这将是一个痛苦的维护。
所以最好的解决方案,IMO,如果你不想使用<pre>
标签,那就是创建一个过滤器,它会为你擦洗文本,并用换行符和不间断空格来填充它。
像这样的东西
app.filter('formatText', function (){
return function(input) {
if(!input) return input;
var output = input
//replace possible line breaks.
.replace(/(\r\n|\r|\n)/g, '<br/>')
//replace tabs
.replace(/\t/g, ' ')
//replace spaces.
.replace(/ /g, ' ');
return output;
};
});
然后使用它你会做这样的事情:
<span ng-bind-html="foo | formatText"></span>
angular-sanitize.js
在脚本引用中包含该文件。'ngSanitize'
在模块声明中要求:var app = angular.module('myApp', ['ngSanitize']);
.. 这样你就可以使用ng-bind-html
orng-bind-html-unsafe
指令了。
正如提到的其他答案,您可以使用过滤器来实现它。
让我为你实现它:
<textarea ng-model="StringValue"></textarea>
<div ng-bind-html-unsafe="StringValue | breakFilter"></div>
angular.module('myApp', []).filter('breakFilter', function () {
return function (text) {
if (text !== undefined) return text.replace(/\n/g, '<br />');
};
});
您始终可以使用 PRE 标签:
<textarea ng-model="StringValue"></textarea>
<pre>{{StringValue}}</pre>
您可能会这样做的另一种方式:
<textarea ng-model="StringValue"></textarea>
<span ng-bind-html-unsafe="newLineToBR(StringValue)"></span>
带有控制器功能:
$scope.newLineToBR = function(text) {
return text ? text.replace(/\n/g, '<br />') : '';
};
或者,正如@sza 所示,更好的方法是将其变成过滤器。这是一个工作示例。
处理您的情况的正确、最简单、语义正确的方法是使用pre
标签。这些标签是专门为已经格式化的文本设计的,这就是你在这里所拥有的。pre
使用 CSS 可以轻松地将标签中的文本设置为看起来像普通文本。
<pre style="font: inherit">{{StringValue}}</pre>
不要问我为什么,但为了工作,我必须在前面replace
有一个额外的\
\n
input.replace(/\\n/g, '<br />')
您可以使用过滤器将换行符 \n 转换为 html 中断。
{{字符串值 | 中断过滤}}
如果你使用Angular
你可以
像这样使用[innerText]
Or It[innerHTML]
<p [innerText]=StringValue /p>