如何控制$scope.$watch迭代
How to control $scope.$watch iteration?
我正在尝试控制$scope.$watch函数。目前,我的迭代有一个无限循环。
$scope.$watch('dashboards', function(newVal, oldVal) {
if (newVal !== oldVal) {
$scope.dashboard = $localStorage.sample;
$scope.dashboards['1'].id = $scope.dashboards[1].id + 1;
$localStorage.sample = $scope.dashboards[1];
console.log('newval: '+$scope.dashboards['1'].id);
} else {
$scope.$storage = $localStorage;
$localStorage.sample = $scope.dashboards[1];
$scope.dashboard = $localStorage.sample;
$scope.dashboards['1'].id = $scope.dashboards[1].id.length + 1;
$localStorage.sample = $scope.dashboards[1];
console.log('oldval: '+$scope.dashboards['1'].id);
}
}, true);
这是我的范围仪表板:
$scope.dashboards = {
'1' : {
id : '1',
widgets : [{
code : "bla1.html",
col : 0,
row : 0,
sizeY : 1,
sizeX : 2,
title : "Bla1"
}, {
code : "bla2.html",
col : 2,
row : 0,
sizeY : 2,
sizeX : 2,
title : "Bla2"
}, {
code : "bla3.html",
col : 0,
row : 4,
sizeY : 1.5,
sizeX : 2,
title : "Bla3"
}
}
我试图实现的是,每次我的 $scope.dashboards 中小部件的位置发生变化时,我都会在 localStorage 中存储一个新 ID 以保存其位置状态,以便在浏览器关闭/刷新时它仍将保留其会话/位置。也许您对我将如何解决这个问题有一个想法?谢谢!
问题的根源在于,通过在$watcher($scope.dashboards
(中为$watched的值分配不同的值,会导致无限循环。
应避免使用 $watch
作为触发器来更新$scope.dashboards.id
,并使用导致小组件更改的实际触发器。(题外话,但属性id
的使用有点尴尬 - id 有一个非常具体的含义,我会把它改成"版本"或类似的东西(
或者,另一种选择是仅$watch widgets
属性,而不是深度监视dashboards
。
$scope.$watch("dashboards['1'].widgets", function(newVal, oldVal){
...
}, true);
您可以使用的方法的粗略概述如下:
var modificationInProgress = false;
$scope.$watch('dashboards', function(newVal, oldVal) {
if (!modificationInProgress) {
modificationInProgress = true;
// modify dashboards
}
$timeout(function() {
modificationInProgress = false;
}, 0);
});
如果您希望在同一刻度中多次修改仪表板,这可能会导致一些有趣的错误。但是,如果您只希望仪表板在每个刻度中修改一次(例如,当用户单击按钮时(,这应该有效。
但是 - 你的代码很奇怪。我认为重构它以避免监视和修改相同的变量可能是您最好的举措。例如,您可能希望监视不同的对象,并存储它们在单独对象上移动的次数,从而避免无限循环问题。
相关文章:
- 强制 $scope.$watch 只开火一次
- 为什么AngularJS$scope.watch()在我告诉它监视数组时会停止工作
- $location.search() - 如何在 $scope.$watch 函数中使用作用域中的参数
- 仅在focusout字段之后调用$scope.watch函数
- $scope.$watch(var,function) undefined 不是函数
- 不断在 $scope.$watch 函数中收到“类型错误:无法读取 null 的属性'值'”
- 对 angular.extend 的调用不会导致 $scope.$watch proc
- $scope.$watch 使用棱角材料
- AngularJS:$scope.$watch 不会更新从自定义指令$resource获取的值
- 在指令中使用 $scope.$watch 处理未定义变量的替代方法
- 如何在 Angular 1.5 组件中等待绑定(没有 $scope.$watch)
- Scope.watch 在指令中调用在开头 angularjs
- Angular 不会保存 $scope.$watch 顺序
- 如何控制$scope.$watch迭代
- 当我将$scope分配给另一个变量并更改新变量上的监视值时,不会触发角度 $scope.$watch
- 具有许多控件的窗体,它们之间具有交互.比$scope.$watch更清洁的方法
- 为什么当我尝试在 scope.$watch 中运行时,getElementsByTagName 为空
- 如何使用$scope.$watch和ng-repeat
- $scope.watch() 在链接函数中
- AngularJS $scope.$watch Jasmine 测试中未定义的回调函数参数