我遇到了我认为是Breeze中的一个错误。为了确保错误与我项目中的其他代码无关,我有simulated the same issue in a plunker provided by Ward Bell。
我添加到Ward的原始plunker的代码是:
在main.html中
<button ng-click="vm.deleteHero(vm.currentHeroVm.hero)">Delete hero</button>
并在main.js
中vm.deleteHero = deleteHero;
function deleteHero(hero) {
console.log(hero.powerMaps.length);
hero.powerMaps.forEach(function(powerMap) {
console.log('Hero: ' + powerMap.heroId + ', Power: ' + powerMap.powerId);
powerMap.entityAspect.setDeleted() // comment me out to see console.log work correctly
});
}
要查看手头的问题,请注意我正在进行的console.log
来电。第一个显示所选英雄的powerMaps
数组的长度。第二个显示循环内powerMap的英雄和幂id。
选择hero
后,打开控制台窗口并点击Delete
按钮。
如果有人注释掉powerMap.entityAspect.setDeleted()
行,则应用程序会正确遍历每个powerMap
。
但是,只要powerMap.entityAspect.setDeleted()
添加到代码中,就不会每个powerMap
都到达。
这意味着我目前无法可靠地遍历数组并删除实体。你会注意到,如果你继续点击删除按钮,代码最终会到达所有实体。
有什么想法吗?
答案 0 :(得分:6)
您不能以这种方式删除实体。它类似于循环遍历列表并在您离开时从中删除项目。它导致你循环的列表随着你的进展而改变,你最终会跳过项目。
改为做。
vm.deleteHero = deleteHero;
function deleteHero(hero) {
console.log(hero.powerMaps.length);
while (hero.powerMaps.length > 0) {
var powerMap = hero.powerMaps[0];
console.log('Hero: ' + powerMap.heroId + ', Power: ' + powerMap.powerId);
powerMap.entityAspect.setDeleted()
});
}
答案 1 :(得分:1)
使用powerMaps
创建Array.slice()
的副本,然后循环删除您的实体。
vm.deleteHero = deleteHero;
function deleteHero(hero) {
hero.powerMaps.slice().forEach(function(powerMap) {
powerMap.entityAspect.setDeleted()
});
}
当您不想删除所有相关实体且无法使用while
时,此功能特别有用。