gpt4 book ai didi

javascript - 避免 $watch() 循环导致 $digest 已在进行中错误

转载 作者:行者123 更新时间:2023-11-28 08:09:35 25 4
gpt4 key购买 nike

此问题与上一个问题相关,该问题已不再查看,因为它有一个已投票的答案:Change jQuery Knob Min/Max value

以下代码是 jQuery 旋钮插件的包装器。我知道现有的 Angular 包装器,但我正在使用它来加深我对 Angular 框架的理解。无论如何,我的问题是,当 $watch() 检测到旋钮的最小值和最大值发生变化时,触发的更改事件会导致 Angular 内发生某种碰撞,从而导致 $digest 已进行中错误。注释掉change函数中的两行并不能阻止错误,但是注释掉$(elem).trigger('change');线路确实如此。这打破了我最初的假设:scope.$apply() 是原因。如果有人知道这里发生了什么,任何信息将不胜感激。谢谢。

App.directive('knobWidget', function () {
return {
scope: {
minbinding: "=minbinding",
minbindingprop: "@minbindingprop",
maxbinding: "=maxbinding",
maxbindingprop: "@maxbindingprop",
delta: "@delta"
},
restrict: 'A',
require: 'ngModel',
link: function (scope, elem, attrs, ngModel) {
ngModel.$render = function () {
$(elem).val(ngModel.$viewValue)
$(elem).trigger("change");
};
$(elem).knob({
min: 0,
max: 1,
value: ngModel.$viewValue,
change: function (changeVal) {
ngModel.$setViewValue(changeVal);
scope.$apply();
}
});
scope.$watch(function () { return scope.maxbinding[scope.maxbindingprop] }, function (newVal) {
$(elem).trigger('configure', { 'max': scope.maxbinding[scope.maxbindingprop] + parseInt(scope.delta) });
$(elem).trigger('change');
});
scope.$watch(function () { return scope.minbinding[scope.minbindingprop] }, function (newVal) {
$(elem).trigger('configure', { 'min': scope.minbinding[scope.minbindingprop] + parseInt(scope.delta) });
$(elem).trigger('change');
});
}
};
});

最佳答案

不要使用 $timeout 使用范围。$$phase 相反

if(!scope.$$phase){
scope.$apply();
}

这将防止循环,而不会使您的代码异步。如果您当前处于摘要周期,则无需调用 apply

关于javascript - 避免 $watch() 循环导致 $digest 已在进行中错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24434708/

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