gpt4 book ai didi

javascript - AngularJS 暂停 $watch 进行内部更新

转载 作者:行者123 更新时间:2023-12-03 07:48:42 24 4
gpt4 key购买 nike

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

我在指令中有一个函数,可以将图表对象转换回文本规范,但如果我只是用更新的值替换规范范围变量,原始 watch 会看到变化(它认为可能来自 Controller ),因此从规范中重新加载图表。这会破坏诸如拖动元素之类的东西,因为元素将从 DOM 中删除并被新元素替换。

我希望能够做的是在进行内部更改时暂时挂起 $watch,或者以其他方式避免 watch 在指令对其进行更改时触发,仅在 Controller 进行更改时才会触发来自外部的变化。我试图围绕进行更改来解除绑定(bind)并重新绑定(bind) watch ,但因为实际检查发生在循环中的其他地方,所以不起作用。我可以使用的另一种解决方案是在 Controller 和指令之间传递两个变量,每个变量传递一个变量,但这有点不优雅。如果有更好的建议,欢迎提出。

最佳答案

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

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

正是出于您概述的原因。我不相信您可以关闭 $watch,因此在对监视变量进行内部更新之前,我会更新该变量的跟踪版本,以确保不会获得无限递归的更改。这看起来很痛苦,但监视的变量是有限的,而且我总是使用 setter 函数,因此更新内部值的代码只写入一次

关于javascript - AngularJS 暂停 $watch 进行内部更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35097432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com