如何绕过$ watch无限循环?

时间:2019-01-16 22:18:48

标签: angularjs

在我的angularJs文件中,我有一个由我的md-select设置的变量设置的手表

<md-select ng-model="NC.common.commonType" ng-model-options="{trackBy: '$value.id'}" flex="25" placeholder="Common Type" ng-disabled="!NC.isEdit()">

在我的控制器中:

scope.$watch('NC.common.commonType', function (new, old) {
        modal.launchModal('Common type changed', '<p>Are you sure?</p>')
        .then((result) => {
            if (!result) {
                vm.module.placementType = angular.copy(oldValue);
        });
    }, true);

因此,当他们选择另一个选项时;它触发一个模态。该模态询问您是否确定要更改模态。如果您拒绝,则将受监视的变量设置回旧值;并忽略新值。这将触发$ watch无限循环。

2 个答案:

答案 0 :(得分:1)

也许可以通过更改您实际更新模型的方式来做到这一点;但是,除了可能在if语句中找到注册/注销手表的方法外;这可能不是一个好主意。

答案 1 :(得分:1)

这就是ng-change的样子

<md-select ng-model="NC.common.commonType" ng-value="NC.common.commonType" ng-change="CC.onChange(NC.common.commonType,'{{NC.common.commonType}}')">

        vm.onChange = function(newValue, oldValue) {
        modal.launchModal('Placement type changed', '<p>Are you sure?</p>')
        .then((result) => {
            if (!result) {
                vm.module.placementType = angular.copy(oldValue);

            } 
        });
    };

这在没有无限循环的情况下起作用