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

标签 javascript angularjs

我编写了一个指令,该指令具有两种方式的绑定(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/

相关文章:

javascript - AngularJS:WAITING $scope 函数内的 ng-click 事件

javascript - 在 Javascript 中合并两个 json 对象?

javascript - Vue.js 不使用 TextTrackCueList 更新 DOM

html - Angular 2 : How to show inner HTML of component-tags inside of component?

php - 打印适合页面的 html 表格

javascript - AngularJS 应用程序中的 Protractor 和 ng-repeat

javascript - 使用 setInterval 移动轮播

javascript - 如何将路径更改广播到 AngularJS 应用程序中的所有 View ?

javascript - 子组件应该在什么级别拥有自己的容器(逻辑react-redux的connect)组件才能管理自己的mapDispatchToProps?

javascript - 将对话框从 angularjs 转换为 ionic1