2

再会,

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

我遇到了一个愚蠢的问题。我在 $scope 上有 3 条数据:宽度、高度和一个数组。我在那个范围上有一个 $watch ,当宽度或高度发生变化时,它正在创建宽度 * 高度长度的新(一维)数组。这很好用。

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

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

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

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

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

谢谢!

聚苯乙烯。代码示例(简化):

$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
}
4

1 回答 1

0

至于你的数组被覆盖,为什么不初始化一次数组:

$scope.someArray = [];

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

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

观察数组的变化(注意 $watch 的第三个参数):

$scope.$watch('someArray', function(newVal, oldVal) {
}, true;
于 2013-09-12T03:36:34.097 回答