breeze错误:在forEach循环中删除了setDeleted
我在微风中遇到了我认为是虫子的东西。为了确保这个bug与我的项目中的其他代码无关,我选择了 我添加到Ward原始plunker中的代码是: 在main.html中breeze错误:在forEach循环中删除了setDeleted,breeze,Breeze,我在微风中遇到了我认为是虫子的东西。为了确保这个bug与我的项目中的其他代码无关,我选择了 我添加到Ward原始plunker中的代码是: 在main.html中 <button ng-click="vm.deleteHero(vm.currentHeroVm.hero)">Delete hero</button> 要查看当前的问题,请注意我正在进行的console.log调用。第一个显示所选英雄的powerMaps数组的长度。第二个显示循环中powerMap的英雄和电
<button ng-click="vm.deleteHero(vm.currentHeroVm.hero)">Delete hero</button>
要查看当前的问题,请注意我正在进行的console.log
调用。第一个显示所选英雄的powerMaps
数组的长度。第二个显示循环中powerMap的英雄和电源ID
选择英雄后,打开控制台窗口并点击删除按钮
如果注释掉了行powerMap.entityAspect.setDeleted()
,应用程序将正确地循环遍历每个powerMap
但是,只要将powerMap.entityAspect.setDeleted()
添加到代码中,并不是每个powerMap
都会到达
这意味着我目前无法可靠地循环一个数组并删除实体。您会注意到,如果继续点击delete按钮,代码最终会到达所有实体
vm.deleteHero = deleteHero;
function deleteHero(hero) {
hero.powerMaps.slice().forEach(function(powerMap) {
powerMap.entityAspect.setDeleted()
});
}
有什么想法吗?你不能这样删除实体。这类似于在列表中循环并在运行时从中删除项目。它会导致您正在循环的列表随着您的进度而更改,最终会跳过项目 改为这样做
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()
});
}
不能以这种方式删除实体。这类似于在列表中循环并在运行时从中删除项目。它会导致您正在循环的列表随着您的进度而更改,最终会跳过项目 改为这样做
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()
});
}
使用
Array.slice()
创建一个powerMaps
副本,并在其上循环以删除实体
vm.deleteHero = deleteHero;
function deleteHero(hero) {
hero.powerMaps.slice().forEach(function(powerMap) {
powerMap.entityAspect.setDeleted()
});
}
当您不想删除所有相关实体并且无法使用
而使用时,这尤其有用。请使用Array.slice()
创建powerMaps
的副本,并在其上循环以删除实体
vm.deleteHero = deleteHero;
function deleteHero(hero) {
hero.powerMaps.slice().forEach(function(powerMap) {
powerMap.entityAspect.setDeleted()
});
}
当您不想删除所有相关实体并且无法在
时使用时,这尤其有用。谢谢-这是一个非常有价值的答案!一个问题——这是js forEach循环固有工作方式的结果吗,或者由于breeze的setDeleted响应它的方式?setDeleted会从导航属性集合中删除该项,而导航属性集合正是您当前正在循环的内容。添加到这一点的一个很好的解释可能是:foreach循环通常使用索引。想象一下从n中删除(x),其中x是索引,n是列表中的总计数。foreach/从3删除(0)
然后从2删除(1)
然后从1删除(2)
错误没有索引位置2@PWKad有一个有趣的情况,应用while方法会导致浏览器挂起在一个循环中,但是foreach方法起作用。对于一个noob来说,它的行为似乎有点不一致。多谢——这是一个非常有价值的答案!一个问题——这是js forEach循环固有工作方式的结果吗,或者由于breeze的setDeleted响应它的方式?setDeleted会从导航属性集合中删除该项,而导航属性集合正是您当前正在循环的内容。添加到这一点的一个很好的解释可能是:foreach循环通常使用索引。想象一下从n中删除(x),其中x是索引,n是列表中的总计数。foreach/从3删除(0)
然后从2删除(1)然后从1删除(2)错误没有索引位置2@PWKad有一个有趣的情况,应用while方法会导致浏览器挂起在一个循环中,但是foreach方法起作用。对一个noob来说,它的行为似乎有点不一致