表达式的 Angular 惰性一次性绑定

Posted

技术标签:

【中文标题】表达式的 Angular 惰性一次性绑定【英文标题】:Angular lazy one-time binding for expressions 【发布时间】:2014-07-21 02:50:30 【问题描述】:

AngularJS 从 1.3.0-beta.10 版本开始有了一个新特性:"lazy one-time binding"。

简单的表达式可以以::为前缀,告诉angular在表达式第一次被评估后停止观察。给出的常见示例如下:

<div>::user.name</div>

以下表达式是否有类似的语法?

<div ng-if="user.isSomething && user.isSomethingElse"></div>
<div ng-class="classNameFoo: user.isSomething"></div>

【问题讨论】:

详细解释请参考 Angular 文档:docs.angularjs.org/guide/expression#one-time-binding 【参考方案1】:

是的。您可以为每个表达式加上 :: 前缀,即使是 ngIfngClass 中的表达式:

<div ng-if="::(user.isSomething && user.isSomethingElse)"></div>
<div ng-class="::classNameFoo: user.isSomething"></div>

实际上,the code 只是检查表达式中的前两个字符是 : 以激活一次性绑定(然后删除它们,因此甚至不需要括号)。其他一切都保持不变。

【讨论】:

它回答了我的问题,尽管一些新功能不能很好地工作:&lt;div ng-if="::user.isSomething"&gt;&lt;/div&gt;&lt;div ng-if="::(!user.isSomething)"&gt;&lt;/div&gt; 都渲染。它可以在没有“::”的情况下工作。 @seldary 我无法重现该问题。正如我在编辑中解释的那样,每个以 :: 为前缀的表达式都对我很有效。如果有疑问,你能做一个小提琴吗? 起初它似乎对我也不起作用,因为 ngClass 定义了多个类。我很快发现绑定仍然是绑定的,因为在 ngClass 中使用的一些监视变量尚未定义(我们知道 angular 会在释放监视程序之前等待首先定义值)。这是一个小小提琴来演示这种行为jsfiddle.net/2LkyLoop。 @MaxRocket bindonce 语法已在 Angular 1.3 中添加。所以它不会在 1.2 或更低版本中工作 ng-if 的一次性绑定似乎不起作用。无论有没有::,观察者数量都非常高。它适用于 ng-class,但 ng-if 似乎不服从我的一次性绑定(1.5.6)。请注意,我正在尝试单向绑定来自 ng-repeat 的对象属性。不确定这是否会有所不同。

以上是关于表达式的 Angular 惰性一次性绑定的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式(.*?)(.+?)惰性匹配

惰性量词和前瞻

Angular2 NgFor在表达式中绑定数组

Angular 2 方式绑定组件 - 检查后表达式已更改

嵌套在惰性一次性 ng-repeat 绑定中的绑定是不是只绑定一次?

Angular 2 / PrimeNG - 表达式在检查后发生了变化。在最后一个无效的表单控件上绑定 NgModel