Angular - 如何暂时停止观看?

时间:2013-09-11 10:43:04

标签: angularjs

美好的一天,

我只是在学习Angular,所以如果你只是指出去哪里就会很高兴。

我遇到了一个愚蠢的问题。我在$ scope上有3个数据:width,height和一个数组。我在该范围上有一个$ watch,当宽度或高度改变时,它会创建宽度*高度长度的新(一个diminsional)数组。这很好用。

现在我需要更改所有三个参数 - 例如设置宽度和高度,而不是创建空数组以使用填充数据的数组。我遇到的问题是似乎没有引入数据数组。

添加以明确:我想要的是用数据数组覆盖已创建的数组。例如。加载已保存的游戏。

我的理解是,当我设置新的宽度时,角度立即开始更新数据并创建具有新宽度和旧高度的新数组。设置新高度时,它被标记为脏,并等待下一个didgest循环。当我设置数据数组时,它会在处理脏高度并创建新的空数组时被覆盖。

问题是:有没有办法确保在插入数据阵列之前完成所有准备工作?

PS。这个例子是简化的,我知道我可以通过设置各种更新标记等来处理这种情况。我对“角度方式”感兴趣 - 是否有某种事件通知处理完成或类似于$的函数申请保证所有变更都得到处理?

谢谢!

PPS。代码示例(简化):

$scope.w = 15;
$scope.h = 15;
$scope.somearray = [];

$scope.$watch('w*h', function() {
  $scope.somearray = [];
  for (var i=0; i<$scope.w * $scope.h; i++) {
    $scope.somearray.push(0);
  }
});

$scope.update = function() {
  $scope.w = 10; // here the previous watch is fired
  $scope.h = 10; // this value marked as dirty
  $scope.somearray = [1,1,1,1,1]; // this data array becomes overwritten when $watch is fired because of the dirty $scope.h
}

1 个答案:

答案 0 :(得分:0)

就你的数组被覆盖而言,为什么不初始化数组一次:

$scope.someArray = [];

然后,在加载数据的函数中:

var newData = aFunctionThatReturnsArray();
$scope.someArray = newData.slice(0);

观察阵列发生变化(注意第3个参数为$ watch):

$scope.$watch('someArray', function(newVal, oldVal) {
}, true;