我应该使用 [innerHTML] 还是通常的方式(Angular 2)

Posted

技术标签:

【中文标题】我应该使用 [innerHTML] 还是通常的方式(Angular 2)【英文标题】:Should I use [innerHTML] or the usual way (Angular 2) 【发布时间】:2016-10-22 06:35:38 【问题描述】:

我的example: string; 在我的component.ts 文件中。我可以通过两种方式输出这个变量(至少我知道):

我能做到:

<p> example </p>

我可以做到:

<p [innerhtml]="example"></p>

好吧,当我使用第一种方式时,我的 IDE (phpStorm) 告诉我我的 var 是不必要的,因为我从未使用过它。但是当我使用第二种方式时,它说我正在使用它。

我应该使用哪种方法有关系吗?

【问题讨论】:

如果页面在设置示例之前加载,第一种方式可能会导致用户在短时间内看到文字字符串“ example ”。出于这个原因,第二种方法更好。 即使我使用 Angular 2? afaik,除非示例是实际的 html,否则您应该使用第一种方式。 innerHTML 用于实际的 html 标记 How to get angular2 [innerHtml] to work的可能重复 【参考方案1】:

根据 Angular 2 文档: https://angular.io/docs/ts/latest/guide/template-syntax.html#!#property-binding-or-interpolation-

没有技术上的理由偏爱一种形式而不是另一种形式。我们倾斜 朝向可读性,这往往有利于插值。我们建议 建立编码风格规则并选择两者的形式 符合规则,对手头的任务感觉最自然。

而且,就担心 innerHTML 有恶意 其中的脚本(您可能喜欢插值的另一个原因):

幸运的是,Angular 数据绑定对危险的 HTML 保持警惕。它 在显示之前对值进行清理。

所以,这真的取决于你。 Angular 团队说他们喜欢 example ,因为它更容易阅读,我倾向于同意他们的观点,但似乎你可以选择任何一种方式。

【讨论】:

在 IE Edge 41.16299.15.0 中,在未定义的字段上使用 innerHTML 时显示“null”。如果您使用插值或innerText,它不会显示。 @keza 我在 IE11 中遇到了同样的问题,想知道是否有人找到了解决方案。【参考方案2】:

我的 IDE 和你的有同样的限制,这很烦人。但请注意,您提供的两个选项并不相同。如果要呈现 HTML 标记(将 DOM 元素添加到页面),请使用:

<p [innerHTML]="example"></p>

如果您希望只输出字符串,不要绑定到此属性。要么使用插值:

<p> example </p>

或者绑定到innerText:

<p [innerText]="example"></p>

为了证明它们不同,在Component中,设置:

example = '<h3>Am I big?</h3>'

然后在你的模板中,有两个 div:

<p [innerText]="example"></p>
<p [innerHTML]="example"></p>

您会看到段落呈现不同:-)

【讨论】:

这应该是公认的答案。注意:如果是 [innerHTML],您必须在 @Component 中使用“封装:ViewEncapsulation.None”,这是最糟糕的部分! :-(

以上是关于我应该使用 [innerHTML] 还是通常的方式(Angular 2)的主要内容,如果未能解决你的问题,请参考以下文章

如何用 jQuery 替换 innerHTML?

在 C 语言中,通常这就是我们使用指针获取输入的方式,那么为啥它不起作用呢?还是我在某些时候错了?

使用 eventpreventDefault 获取无法设置属性“innerHTML”为空

createElement() 与 innerHTML 啥时候使用?

Javascript |按钮未使用 .innerHTML 提交表单

Javascript:文档 innerHTML 替换中断表单