我编写了一个指令,它具有双向绑定,为流程图引入文本规范,该流程图用于生成指令中的实际对象(步骤和连接)。我在指令中设置了一个$watch,以允许控制器发送一个新的规范(例如加载一个新的图表),但我也希望该指令能够响应用户的操作(例如删除连接)对规范进行更改,以便控制器能够保存更改的规范。
我在指令中有一个函数,该函数将图表对象转换回文本规范,但是如果我用更新的值替换规范范围变量,原始手表将看到一个更改(它认为它可能来自控制器),因此从规范重新加载图表。这会破坏一些东西,比如拖动元素,因为这些元素将从DOM中移除,并被新的元素所取代。
我想要做的是在进行内部更改时暂时挂起$watch,或者以其他方式避免手表在指令更改时触发,只有当控制器从外部进行更改时才会触发。我试图解除绑定和重新绑定手表进行更改,但因为实际的检查发生在周期的其他地方,但不起作用。我可以使用的另一种解决方案是在控制器和指令之间传递两个变量,每个变量一个,但这有点不雅观。任何更好的建议都将受到欢迎。
发布于 2016-01-30 05:51:09
当我这样做时,我的$watch通常如下所示:
$scope.$watch('MyVar',function(newval,oldval) {
if (oldval == newval) return;
if (newval == $scope.internalval) return;
// process here
})这正是你勾勒的原因。我不相信您可以关闭$watch,所以在对被监视的变量进行内部更新之前,我会更新变量的跟踪版本,以确保不会得到无限递归的更改。这似乎很痛苦,但观察到的变量是有限的,我总是使用setter函数,所以更新内部值的代码只编写一次。
https://stackoverflow.com/questions/35097432
复制相似问题