dart polymer - 突破异常:迭代期间的并发修改:'ObservableList'的实例

时间:2014-07-14 08:43:06

标签: dart polymer

我有一个错误:" ConcurrentModificationError" - 打破异常:迭代期间的并发修改:' ObservableList'的实例。

当我想在" ForEach"期间删除ObservableList的一些项目。习惯于搜索"项目

代码示例:

html的

<template repeat="{{f in SelectedFiles}}">
    <li>
        <span class="label">{{f.name}}"">

        <button class="tiny" on-click="{{deleteDataSetFile}}" data-file="{{f.path}}">Delete</button>
    </li>
</template>

.dart

@observable List<String> fileSelected;

void deleteDataSetFile(Event event, var detail, var target) {

    String datafile = target.attributes['data-file'];

    for(var file in this.SelectedFiles){
        if(file.path==datafile){
        this.SelectedFiles.remove(file);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

解决方案“。dart”

@observable List<String> fileSelected;

void deleteDataSetFile(Event event, var detail, var target) {

    String datafile = target.attributes['data-file']; 
    var tmp;
    for(var file in this.SelectedFiles){
        if(file.path==datafile){
           tmp = file;
        }
    }
    if(tmp!=null){
        this.SelectedFiles.remove(tmp);
    }
}

答案 1 :(得分:1)

这在大多数编程语言中都不起作用。

解决方法:

遍历列表的副本

@observable List<String> fileSelected;

void deleteDataSetFile(Event event, var detail, var target) {
  String datafile = target.attributes['data-file'];
  for(var file in this.SelectedFiles.toList()){ // added .toList() which returns a copy
    if(file.path==datafile){
      this.SelectedFiles.remove(file);
    }
  }
}

存储元素并稍后将其删除

@observable List<String> fileSelected;

void deleteDataSetFile(Event event, var detail, var target) {
  String datafile = target.attributes['data-file'];
  List<String> itemsToRemove = [];
  for(var file in this.SelectedFiles){ 
    if(file.path==datafile){
      itemsToRemove.add(file);
    }
  }
  for(var file in itemsToRemove) {
    this.SelectedFiles.remove(file);
  }
}

如果你以不同的方式迭代,你可以在迭代时删除

  for(int i = 0; i < this.SelectedFiles.length;){ 
    if(file.path==datafile){
      this.SelectedFiles.removeAt(i)
    } else {
      i++;
    }
  }

或使用List

的retainWhere / removeWhere方法
this.SelectedFiles.retainWhere((e) => e.path != dataFile);
this.SelectedFiles.removeWhere((e) => e.path == dataFile);