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

pat*_*ick 29 angularjs

如果我有一个视图:

<div ng-repeat="foo in foos">
  <p ng-if="bar">omg lol</p>
  <p ng-if="!bar">lol omg</p>
</div>
Run Code Online (Sandbox Code Playgroud)

我实际上创造了(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>
Run Code Online (Sandbox Code Playgroud)

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

PSL*_*PSL 36

只是扩展我的评论来回答.

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

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

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

在你的特定的plunker你也可以这样做:

<ul ng-repeat="item in items"  ng-if="::lol">
  <li>{{ ::item }}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

代替

<ul ng-repeat="item in items">
  <li ng-if="::lol">{{ ::item }}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)