breeze错误:在forEach循环中删除了setDeleted

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的英雄和电

我在微风中遇到了我认为是虫子的东西。为了确保这个bug与我的项目中的其他代码无关,我选择了

我添加到Ward原始plunker中的代码是:

在main.html中

<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来说,它的行为似乎有点不一致