如果我的观点有:
<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个观察者的东西......所以我正在寻找另一种选择,以避免像那样愚蠢。
答案 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