一次性绑定与ng-if在角度?

时间:2015-06-17 23:33:36

标签: angularjs

如果我的观点有:

<div ng-repeat="foo in foos">
  <p ng-if="bar">omg lol</p>
  <p ng-if="!bar">lol omg</p>
</div>

我实际上正在创建(2 * foos.length)+ 1 $$观察者,这真的不太好。我在网上找到了几个说你可以做ng-if =“:: bar”的消息来源,但是当我这样做时,观察者的数量并没有改变。有没有办法强制ng-if是一次性绑定?

这真的非常愚蠢:

<div ng-repeat="foo in foos" ng-if="bar">
  <p>omg lol</p>
</div>
<div ng-repeat="foo in foos" ng-if="!bar">
  <p>lol omg</p>
</div>

我相信这会给我一些像4个观察者的东西......所以我正在寻找另一种选择,以避免像那样愚蠢。

2 个答案:

答案 0 :(得分:36)

只是扩展我的评论以回答。

Angular 1.3一次性绑定语法(::)确实会删除不必要的监视。只需在设置相关数据后需要测量手表一段时间。这就是为什么。当您在视图上设置一次性绑定属性时,angular将在其上设置临时监视,直到它获得定义的值,即除undefined之外的任何值。这种方法有一个原因 - 为了支持通过延迟操作(如ajax调用,超时,承诺链解析等)填充的绑定值。如果没有这个::将无法在除前填充的边界值。

因此,请确保在某个时间点为一次性绑定值设置一些值。不要让它保持不确定。

当你有一个条件<div ng-if="::lol"></div>重复100次时说。只需确保将值绑定到转发器或确定lol状态的某些操作即使该操作失败(例如ajax调用错误)仍设置值(即使null也是javascript中的值)。在即将到来的摘要周期之后将删除手表,这将呈现相应的DOM绑定。

在您的特定掠夺者中,您也可以这样做:

<ul ng-repeat="item in items"  ng-if="::lol">
  <li>{{ ::item }}</li>
</ul>

而不是

<ul ng-repeat="item in items">
  <li ng-if="::lol">{{ ::item }}</li>
</ul>

答案 1 :(得分:0)

您需要使用Bindeonce执行此操作:https://github.com/Pasvaz/bindonce