关于AngularJS:与NG一次性绑定

one-time binding with ng-if in angular?

如果我有这样的观点:

1
2
3
4
  <p ng-if="bar">omg lol
</p>
  <p ng-if="!bar">lol omg
</p>

我正在创建(2*foos.length)+1$watchers,这真的不好。我在网上找到了几个消息来源,说如果"::bar",你可以做ng,但是当我这样做时,观察者的数量不会改变。有没有办法强迫ng成为一次性约束?

必须这样做真的非常愚蠢:

1
2
3
4
5
6
7
8
  <p>
omg lol
</p>


  <p>
lol omg
</p>

我相信它会给我4美元的观察者…所以我正在寻找一种替代方法来避免这种愚蠢的行为。


只是把我的意见扩展到回答。

Angular1.3一次性绑定语法(::的确会删除不必要的表。只是在你设置了相关的数据之后,你需要测量一下手表。这就是为什么。当对视图设置一次性绑定属性时,Angular将对其设置临时监视,直到它获得定义的值,即除undefined以外的任何值。这种方法是有原因的——为了支持通过延迟操作(如Ajax调用、超时、承诺链解析等)填充的绑定值。如果没有这个::,除了预先填充的绑定值外,任何东西都无法成功工作。

因此,只要确保在某个时间点将某个值设置为一次性绑定的值。不要让它保持未定义状态。

当你有一个条件时,重复100次。只需确保将值绑定到中继器或某些确定lol状态的操作时,即使该操作失败(例如ajax调用错误),仍然为其设置值(即使null也是javascript中的值)。在呈现各自的DOM绑定的即将到来的摘要循环之后,将删除监视。

在你的具体掠夺中,你也可以这样做:

1
2
3
4
5
6
7
8
<ul ng-repeat="item in items"  ng-if="::lol">
 
<li>
{{ ::item }}
</li>


</ul>

而不是

1
2
3
4
5
6
<ul ng-repeat="item in items">
  <li ng-if="::lol">{{ ::item }}
</li>


</ul>

您需要使用bindeonce来执行此操作:https://github.com/pasvaz/bindonce