$ watchGroup意外行为

时间:2015-07-28 09:21:34

标签: javascript angularjs

我一直在使用$ watchGroup来观察一系列字段并触发一系列功能,具体取决于特定字段是否已更改。

我已设置以下plnkr来展示我遇到的意外行为。

// Test Logging
tasks.withType(Test) {
    testLogging {
        events "started", "passed", "skipped", "failed"
    }
}

该方案涉及三个监视字段,我想根据哪个字段已更改来触发函数。我一直在使用'newValues'和'oldValues'来监控哪个字段发生了变化。

我遇到的问题是,如果我更改了“Second”字段然后去改变“First”或“Third”字段,则触发“Second”函数,因为它存储了之前的'newValues '和'oldValues'使它看起来像“第二”字段已经改变,如image中所示。

我突出了图片中的异常情况。我希望一旦我开始改变“第三”字段,“第二”字段的“newValues”和“oldValues”与字段改变不一样。

我知道我可以坚持两个级别的旧值并比较它们来解决这个问题,但是我希望它可以像我所描述的那样工作。任何澄清,如果这是一个错误或预期的功能,将不胜感激。

$ watchGroup的角度文档声明watchExpressions是一个“将使用$ watch()单独监视的表达式数组”。这让我觉得这不是功能。

1 个答案:

答案 0 :(得分:0)

通过观看组的Angular文档和内部使用$ watch表示每个单独的表达我认为您所看到的是预期的行为

来自$ watchGroup的文档,

   *    The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching
   *    those of `watchExpression`
   *    and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching
   *    those of `watchExpression`

因此新值始终只有最新值,旧值包含前一个值。

其次,$ watchGroup在内部调用$ watch [你所看到的是与watch相同的行为]。 $ watch更新最后一个值和当前值,然后仅在当前值与上一个值不同时才调用侦听器函数。所以在这种情况下,比如当你更新“第一个'在第二个'之后的表达表达式,没有为第二个'调用监听器功能。表达式和旧值仍然是第二个值'。

如果你的监听器功能真的取决于哪个表达式已经改变,那么你最好使用$ watch而不是$ watchGroup [恕我直言,我不会看到性能差异,因为$ watch将会是触发所有表达式]。但是如果你想调用一个普通的处理程序并传递所有新的值而不管哪个表达式发生了变化,你可以去$ watchGroup。

所有人都说,如果你能把这个发布在有角度的小组中并且从马的口中得到证实,那将会是一件好事。" :)