Polymer 1.0 array splice正在删除数组中的错误项

时间:2016-12-30 15:08:45

标签: javascript arrays polymer splice html5-template

我正在尝试在Polymer中创建一个简单的待办事项列表,并且我有添加部分工作。当我点击"删除"项目旁边的图标,它会删除最近添加的项目,而不是应删除的项目。它看起来像是得到了错误的数组索引,而且我不确定如何修复它?谢谢!

<dom-module id="my-todo-list">
<template>

<div class="card">

  <div class="form">
    <paper-input label="Task" value="{{todo.task}}"></paper-input>
    <paper-button raised on-tap="_addTodo">Add Todo</paper-button>
  </div>

  <template is="dom-repeat" items="{{todos}}">
    <paper-card class="todos">
      <paper-checkbox id="checkTodo" on-click="_completeTodo"></paper-checkbox>
      <p>{{item.task}}</p>
      <iron-icon icon="delete" on-tap="_destroyAction"></iron-icon>
    </paper-card>
  </template>

</div>

</template>

<script>
Polymer({
  is: 'my-todo-list',

  properties: {
    todo: {
      type: Object,
      value: function() {
        return {};
      }
    },
    todos: {
      type: Array,
      value: function() {
        return [];
      }
    }
  },

  _addTodo: function() {
    console.log(this.todo);
    this.push('todos', this.todo);
    // this.todo = {};
  },

  _destroyAction: function(todo) {
    var index = this.todos.indexOf(todo);
    this.splice('todos', index, 1);
  },
});
 </script>
</dom-module>

2 个答案:

答案 0 :(得分:1)

第一个问题是您始终在this.todo方法中向对象_addTodo()插入相同的引用。相反,你应该制作一个对象的副本。您还可以添加一个ID,以区别于其他项目。

  _addTodo: function() {
    var copy = Object.assign({}, this.todo);    
    copy.id = this.push('todos', copy);
    // this.todo = {};
  }

然后你可以在HTML模板中添加相同的ID:

<paper-card class="todos" id="{{item.id}}">

现在,您可以使用_destroyAction()方法和Array.findIndex()属性修改Event.target方法以在数组中找到正确的元素:

  _destroyAction: function(ev) {
    var index = this.todos.findIndex( function(item) { 
        return item.id == ev.target.parentElement.id 
    } );
    this.splice('todos', index, 1);
  }

答案 1 :(得分:0)

Array.prototype.indexOf不适用于查找对象。您可以使用像lodash或Array.prototype.find这样的实用程序库。但是在所有浏览器中都不支持,因此请确保包含polyfill。两者都在lodash中找到,而本地的一个将回调函数作为参数。