Angular:在html模板中使用三元运算符

Angular: Using the ternary operator in html template

可以在 html:

中像这样使用简单的三元运算符
<div> {{ showStringOneFlag ? 'Display String 1' : 'Display String 2' }} </div>

这可能比在javascript中设置一个字符串变量20次更方便。

我的问题是三元运算符是否太昂贵而无法在每个摘要周期中执行?应该避免或谨慎使用此功能吗?它在摘要周期中的足迹是否最小并且无需担心?我到处寻找答案,我发现它在速度方面与 if/else 语句相当,但在 html 中并没有真正等同于 if/else 语句。

简而言之,这取决于您有条件地渲染什么,以及使用三元是否有意义。

对于简单的条件渲染,当然,三元就可以了,不会以明显的方式影响性能。

但是,如果您有条件地渲染大量代码,或者在代码中的多个点执行 several/complex 计算以确定渲染的内容,那么在 HTML.

有关详细信息,请参阅此 SO link

HTML 是一种声明性标记语言,不支持 if 语句等控制结构。很可能你指的是一些模板引擎 - 截至目前 - 是未知的并且无法推理。

如果你想在你的应用程序中广泛使用它,我认为你可以,只要你不将它与 Angular 的默认更改检测策略一起使用。默认情况下,DOM 事件、xhr 和计时器将触发更改检测,这将导致 Angular 重新评估该表达式,如果您之前从未处理过 angular 的默认更改检测策略让我向你保证 运行 比你想象的要多得多。如果您曾经将控制台日志放入组件中,但只看到它在您的开发工具中记录了数百次,那么这很可能是默认策略与模板中的函数混合在一起。

那么还有什么政策呢? OnPush

概括地说,如果您的组件仅从@Input 获取数据(就像在 container/presentation 组件模型中那样),则可以使用 OnPush 检测。如果你这样做,而不是 Angular 运行 在 DOM 事件、xhr 和计时器上进行变化检测,它只会在 @Input 发生变化时进行 运行 变化检测,这显然是更有效率。

TL;DR
如果您想经常使用该表达式,您应该考虑使用 OnPush 更改检测,这将防止它不必要地重新评估该表达式。

更改检测介绍:
https://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html
https://medium.com/@bencabanes/angular-change-detection-strategy-an-introduction-819aaa7204e7

1) 三元运算符是否太昂贵以至于无法在每个摘要循环中执行?

在每个摘要周期执行三元运算符本身应该不会太昂贵。三元运算符应该在微秒范围内进行评估。话虽如此,如果您调用一个计算结果为 truthy/falsy 的函数,或者如果您的三元运算符本身调用一个函数,那么它可能需要几毫秒以上,具体取决于您的函数的开销。

2) 是否应避免或谨慎使用此功能?

如果它们是干净的三元运算符,即在不调用函数的情况下进行显式比较,那么您应该可以使用任意多个,应该不会有太大影响。

3) 我到处寻找答案,我发现它在速度方面与 if/else 语句相当,但在 html 中并没有真正等同于 if/else声明。

这显然是您对 Angular 插值工作原理的误解。我建议阅读 Template Syntax