我似乎无法获得一次性约束。我的实际应用程序逻辑对于plunker来说有点过于复杂,但我甚至无法在我的应用程序中使用像http://plnkr.co/edit/ka57xquoR2ZdY2F0li76这样的简单方案。 Here is the plunker我的确切代码到文件结构。我删除了应用程序中的所有内容,以使最简单的一次性绑定示例正常工作 - 它在plunker中工作,但不在我的代码中。
我正在使用AngularJS 1.3.0-rc.4
以下是plunker中的内容片段
{{::current.text}}
<br />
{{current.text}}
<br />
<input ng-model="current.text" type="text" />
<br />
在我的应用中,当文本框更新时,{{::current.text}}
和{{current.text}}
都已更新...
是否存在可能关闭或一次性绑定或阻止范围变量解决的问题,以便一次性绑定可以启动?
答案 0 :(得分:21)
原来是造成这种行为的是Batarang(chrome&#39; angularjs调试扩展)。我的猜测是,它的持续监控会阻止范围变量的确定,因此一次性绑定并没有开始。
答案 1 :(得分:2)
正如Richard Hermanson指出的那样,你必须删除所有与该bug无关的html,直到你有一个足够简单的子集来理解导致它的原因。
如果你想要一个随机猜测,也许这个曾经绑定的元素包含在DOM本身重建的元素中,因此每次都会重新初始化bind-once。
例如
<div ng-if="someOndition">
<div>{{::current.text}}</div>
</div>
每次ng-if从false变为true时,其内部html将被重新编译并添加到DOM中。这可能不是你的问题,但我唯一能看到的是重新编译指令。
答案 2 :(得分:0)
我遇到的一个稍微不同的情况是表达式返回的结果以某种方式与当前时间相关联,以毫秒为单位,因此足够精细,以便在摘要循环中的每个可能的多个调用中返回不同的结果。 / p>
在我的情况下,尽管在当前摘要周期结束时将一次性绑定表达式标记为取消注册,但是在我可以收集的同一摘要周期内,表达式被重新评估多次。这导致超出摘要迭代限制并导致控制台日志错误消息如下所示:
Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting! Watchers fired in the last 5 iterations:
[[{"msg":"fn: oneTimeWatch","newVal":"1475668099352","oldVal":"1475668099346"}],
[{"msg":"fn: oneTimeWatch","newVal":"1475668099356","oldVal":"1475668099352"}],
[{"msg":"fn: ...
在我的特定情况下,保证表达式在第一次调用该输入后始终为给定输入返回相同的值,从而允许一次性绑定正常工作。有点反直觉,这就是为什么它让我感到高兴,但也许这对某些人有用!