breeze bug:forDeach循环中的setDeleted

时间:2014-03-11 09:06:27

标签: breeze

我遇到了我认为是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都到达。

这意味着我目前无法可靠地遍历数组并删除实体。你会注意到,如果你继续点击删除按钮,代码最终会到达所有实体。

有什么想法吗?

2 个答案:

答案 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时,此功能特别有用。