美好的一天,
我只是在学习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
}
答案 0 :(得分:0)
就你的数组被覆盖而言,为什么不初始化数组一次:
$scope.someArray = [];
然后,在加载数据的函数中:
var newData = aFunctionThatReturnsArray();
$scope.someArray = newData.slice(0);
观察阵列发生变化(注意第3个参数为$ watch):
$scope.$watch('someArray', function(newVal, oldVal) {
}, true;