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美元的观察者…所以我正在寻找一种替代方法来避免这种愚蠢的行为。
- ::是一次性绑定。只是它最初会创建一个临时监视,然后在将值分配给绑定属性后将其移除。你有证据吗?
- 是的,这里有一个punker显示在dom被呈现后2秒,$watcher计数是2000,只是从一个ng if…plnkr.co/edit/jgp3lryuspqnigr8ri?P=预览
- 我看到的是
- {{ ::item }}</li>
观察者计数=>2,不加lol和::的前缀,它是1002。你说什么?
- 完全困惑…什么?所以你是说在你的浏览器超时后,警报窗口会弹出2个观察者?
- 是的…当然。我试过铬和FF(应该没关系)。点击我的评论中的这两个链接。试想一下,这就是使用一次性绑定和激励任何人(至少我这样做了:)迁移的全部目的,当它被释放以克服bindonce的遗留问题时。
- 很抱歉,我以为我用::lol保存了版本,而不仅仅是lol。这很奇怪,因为这不是我在应用程序中遇到的行为,我的ng if中的::前缀完全不做任何事情,我的观察者计数为数千,所以我想我需要进一步调查。
- 这很可能是因为在应用程序中,实际数据可能以延迟的方式绑定(通过Ajax调用等)。在此之前,这些观察者将在那里(当它得到一个未定义的值时,它们将被删除)。如果它不这样做,那么一次绑定对于延迟的数据绑定方法将是失败的。
- 啊…不,我刚知道是什么!我的指令使用配置来说明是否在视图的ng中继器中呈现内容…默认情况下,有些配置选项是错误的,只是不提供值。如果scope.lol未定义,则::lol仍会添加观察程序。plnkr.co/edit/gdb893nv4jdzecdtnkyz?P=预览
- 这是预期的。查看我的上一条评论(括号中的内容)。您没有在lol上设置任何内容。如果您希望在某些操作期间设置lol,则不会发生这种情况。如果条件失败,则将其设置为假。您只需要确保如果您设置的是一次性绑定,那么最终会为它设置一些值(即使空值也是一个不稳定的值)。如果你有清除不需要的手表的优势,那就没什么大不了的了。
- 谢谢你的帮助。你应该把答案贴出来,这样我才能接受。
- 不客气。很高兴我能澄清……当然,我会把我的评论扩展到一个答案。谢谢!
只是把我的意见扩展到回答。
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
- 不是因为本机支持使用::语法的一次性绑定的AngularJS 1.3
- @MXA055你读过我的问题吗?ng if="::foo"不起作用。它仍然创造了无数的观察者。