Arrays 数组中的变异数组(聚合铁列表)
我目前在另一份铁名单中有一份铁名单。父项的数据来自firebase查询元素,子项的数据是从每个父项计算出来的。db结构和代码看起来有点像这样:Arrays 数组中的变异数组(聚合铁列表),arrays,polymer,iron-list,Arrays,Polymer,Iron List,我目前在另一份铁名单中有一份铁名单。父项的数据来自firebase查询元素,子项的数据是从每个父项计算出来的。db结构和代码看起来有点像这样: DB: [ category1: [ itemId1: { price: 10, title: "title" } ]
DB: [
category1: [
itemId1: {
price: 10,
title: "title"
}
]
]
<iron-list id="categoryList" items="{{categories}}" multi-selection as="category">
<template>
<div class="category-holder">
<iron-list id="{{category.$key}}" items="{{_removeExtraIndex(category)}}" as="item" selection-enabled multi-selection selected-items="{{selectedItems}}" grid>
<template>
<div class$="{{_computeItemClass(selected)}}">
<p>[[item.title]]</p>
<p>[[item.price]]</p>
</div>
</template>
</iron-list>
</div>
</template>
</iron-list>
我迭代所选项目以提取项目索引,然后迭代父铁名单数据(categoryItems),以检查给定项目是否存在于该数据子集中。如果是这样,那么我将使用类别索引并尝试使用给定的路径调用父铁列表上的set来访问我要编辑的实际项目。正如所料,这是失败的。希望我已经说得够清楚了,任何帮助都将不胜感激
编辑#1:
经过多次试验,我终于想出了如何正确地变异儿童铁名单:
(this.selectedItems).forEach(function(item) {
var list = this.$.categoryList.querySelector('#' + item.category);
var index = list.items.indexOf(item);
list.set(["items", index, "price"], 30);
}, this);
有几件事值得注意。我正在使用querySelector而不是推荐的。$$(选择器),因为我一直遇到“function DNE”错误。但现在我有另一个问题…调用函数后,值得到正确更新,但我得到以下错误:
Uncaught TypeError: inst.dispatchEvent is not a function
下面是完整错误消息的图片:
我看到了光明,希望有人能帮助我 好吧,我来试试这个。我认为会发生以下情况,我想这是基于dom repeat的工作原理:
var categories = this.$.categoryList;
var categoryItems = categories.items;
您使用铁名单所基于的变量,但将一个数组设置为另一个数组只会在javascript中创建一个引用。更新categoryItems后,也会更新此。$.categoryList.items。稍后设置新值时,iron list将执行脏检查并比较所有子属性,并且因为它们相等(因为…引用),iron list不会更新dom
您应该做的是确保它是一个全新的副本,方法是使用JSON.parse(JSON.stringify(myArray))
此外,我在代码中看到的一个主要缺陷是使用querySelector选择一个元素,然后对其进行操作。您应该做的是使用this.categories,而仅使用该变量
因此,您的方法应该如下所示:
// Get a freshly new array to manipulate
var category = JSON.parse(JSON.stringify(this.categories);
// Loop through it
category.forEach(category) {
// update your categoryList variable
}
// Update the iron list by notifying Polymer that categories has changed.
this.set('categories', category);
好的,我来试试这个。我认为会发生以下情况,我想这是基于dom repeat的工作原理:
var categories = this.$.categoryList;
var categoryItems = categories.items;
您使用铁名单所基于的变量,但将一个数组设置为另一个数组只会在javascript中创建一个引用。更新categoryItems后,也会更新此。$.categoryList.items。稍后设置新值时,iron list将执行脏检查并比较所有子属性,并且因为它们相等(因为…引用),iron list不会更新dom
您应该做的是确保它是一个全新的副本,方法是使用JSON.parse(JSON.stringify(myArray))
此外,我在代码中看到的一个主要缺陷是使用querySelector选择一个元素,然后对其进行操作。您应该做的是使用this.categories,而仅使用该变量
因此,您的方法应该如下所示:
// Get a freshly new array to manipulate
var category = JSON.parse(JSON.stringify(this.categories);
// Loop through it
category.forEach(category) {
// update your categoryList variable
}
// Update the iron list by notifying Polymer that categories has changed.
this.set('categories', category);