我花了一个小时来调试一个非常琐碎的问题。但是我不明白为什么这种行为有时在什么条件下发生。为了说明我的问题,让我们举一个例子。
$scope.vm.PetList = pets; // pets comes from resolved request
$scope.vm.Person = person; // person comes from resolved request
// init logic
if (angular.isDefined($scope.vm.Person.Pets) && $scope.vm.Person.Pets.length) {
angular.forEach($scope.vm.Person.Pets, function (pet) {
// this is the part that works sometimes
pet = FunctionThatReturnsObjectOrNull($scope.vm.PetList, 'Id', pet.Id);
});
angular.forEach($scope.vm.Person.Pets, function (pet, pkey) {
// this works every time
$scope.vm.Person.Pets[pkey] = FunctionThatReturnsObjectOrNull($scope.vm.PetList, 'Id', pet.Id);
});
}
在这个特定的示例中,我不知道为什么要从宠物收藏中查找某人的宠物,但这足以说明我遇到问题的情况。
重要的是要注意,分配的右边总是正确评估。在第一个示例中,pet
变量的赋值并不总是代表数组中的更改。
我了解为什么$scope.vm.Person.Pets[pkey]
每次都能工作,因为那是正确的数组表示法。但是pet =
表示法可以省去跟踪嵌套数组的keys
的麻烦。
angular.forEach(collection, function (a) {
if (a.collection.length > 0) {
angular.forEach(a.collection, function (b) {
b = doSomething();
});
}
});
如果有人可以对此有所了解,我将不胜感激。
答案 0 :(得分:1)
pet
提供给迭代器函数的angular.forEach
是对该数组内对象的“引用”。调用pet = ...
是重新分配该引用以指向新对象,而不更改原始对象。
pets[pkey] = ...
正在更新数组中的引用。