【问题标题】:Why is this one time binding behaving as if it isn't there?为什么这个一次性绑定表现得好像它不存在一样?
【发布时间】:2014-10-08 20:33:11
【问题描述】:

我似乎无法让一次性绑定工作。我的实际应用程序逻辑对于 plunker 来说有点过于复杂,但我什至无法在我的应用程序中得到像 http://plnkr.co/edit/ka57xquoR2ZdY2F0li76 这样的简单场景。 Here is the plunker 我的确切代码到文件结构。我从应用程序中删除了所有内容,以获得最简单的一次性绑定示例 - 它在 plunker 中有效,但在我的代码中无效。

我正在使用 AngularJS 1.3.0-rc.4

这是 plunker 里的东西的 sn-p

{{::current.text}}
<br />
{{current.text}}
<br />
<input ng-model="current.text" type="text" />
<br />

在我的应用程序中,{{::current.text}}{{current.text}} 在文本框更新时都会更新...

是否有什么可以关闭或一次性绑定或阻止范围变量稳定以便一次性绑定可以启动?

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    原来是 Batarang(chrome 的 angularjs 调试扩展)导致了这种行为。我猜它的持续监控会阻止范围变量稳定,因此一次性绑定没有开始。

    【讨论】:

    【解决方案2】:

    正如 Richard Hermanson 所指出的,您必须删除所有与该错误无关的 html,直到您有一个足够简单的子集来了解导致它的原因。

    如果您想随机猜测,可能曾经绑定的元素包含在一个元素中,该元素本身在 DOM 中重建,因此每次都重新初始化绑定一次。

    例如

    <div ng-if="someOndition">
      <div>{{::current.text}}</div>
    </div>
    

    每次 ng-if 从 false 变为 true 时,它​​的内部 html 都会重新编译并添加到 DOM。这可能不是你的问题,但我唯一能看到的是重新编译指令。

    【讨论】:

      【解决方案3】:

      我遇到的一个稍微不同的情况是,表达式返回的结果以某种方式与当前时间(以毫秒为单位)相关,如此精细,以至于在摘要循环内可能的多次调用中的每一个都返回不同的结果。

      在我的例子中,虽然一次性绑定表达式将在当前摘要周期结束时被标记为注销,但据我所知,该表达式在同一摘要周期内被重新评估多次。这导致超出摘要迭代限制,并导致控制台日志错误消息被喷出,如下所示:

      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: ...
      

      在我的特定情况下,保证表达式在第一次调用给定输入后始终为该输入返回相同的值允许一次性绑定正常工作。有点违反直觉,这就是它让我感到困惑的原因,但也许这对某人有用!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多