【问题标题】:dart polymer - Breaking on exception: Concurrent modification during iteration: Instance of 'ObservableList'飞镖聚合物 - 打破异常:迭代期间的并发修改:'ObservableList'的实例
【发布时间】:2014-09-04 03:18:44
【问题描述】:

我有一个错误:“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);
        }
    }
}

【问题讨论】:

    标签: dart polymer


    【解决方案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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      这不适用于大多数编程语言。

      解决方法:

      遍历列表的副本

      @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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        • 1970-01-01
        相关资源
        最近更新 更多