AngularJS暂停$ watch进行内部更新

时间:2016-01-30 02:52:47

标签: javascript angularjs

我编写了一个带有双向绑定的指令,用于引入流程图的文本规范,该流程图用于生成指令内的实际对象(步骤和连接)。我在指令中设置了$ watch以允许控制器发送新规范(例如加载新图表),但我也希望指令对规范进行更改以响应用户操作(例如删除连接),以便控制器可以保存更改的规范。

我在指令中有一个函数将图表对象转换回文本规范,但是如果我只是用更新的值替换规范范围变量,原始监视会看到一个变化(它认为可能来自于控制器),然后重新加载规范中的图表。这会导致像拖动元素一样破坏,因为元素正在从DOM中删除并被新的元素替换。

我希望能够做的是在我进行内部更改时临时暂停$ watch,或以其他方式避免手表在指令对其进行更改时触发,仅在控制器进行时关闭来自外部的变化。我尝试取消绑定并重新绑定手表进行更改,但因为实际检查发生在循环中的其他地方不起作用。我可以使用的替代解决方案是在控制器和指令之间传递两个变量,一个是每个方向,但这有点不优雅。任何更好的建议都会受到欢迎。

1 个答案:

答案 0 :(得分:1)

当我这样做时,通常我的$ watch看起来像这样:

$scope.$watch('MyVar',function(newval,oldval) {
    if (oldval == newval) return;
    if (newval == $scope.internalval) return;
    // process here
})

正是您提出的原因。我不相信你可以关闭$ watch,所以在我对监视变量进行内部更新之前,我更新了变量的跟踪版本以确保我没有得到无限递归的更改。这似乎是一种痛苦,但观察到的变量是有限的,我总是使用一个setter函数,因此更新内部值的代码只写一次