Контекст
Я делаю страницу, которая отображает список предметов. На странице перечислены элементы, самые новые и самые старые, и они классифицируются сначала по годам, а затем по месяцам. Это будет выглядеть примерно так:
2019
Март
- элемент списка
- элемент списка 2
Февраль
2018
Октябрь
- элемент списка 4
- элемент списка 5
- элемент списка 6
Май
Упрощенная версия HTML:
<template is="dom-repeat" items="{{years}}" as="year">
<span>[[year.name]]</span>
<div id="same-year-items>
<template is="dom-repeat" items="{{year.months}}" as="month">
<span>[[month.name]]</span>
<div id="same-month-items">
<template is="dom-repeat" items="{{month.items}}" as="item">
<custom-list-item item="{{item}}"></custom-list-item>
</template>
</div>
</template>
</div>
</template>
В файле Javascript я определяю свойство массива years
. Каждый год в years
содержит массив months
, а каждый месяц в months
содержит массив items
(см. Элементы dom-repeat). Я запрашиваю в базе данных некоторые элементы списка, перебираю каждый элемент и затем добавляю его в соответствующий массив месяцев.
выпуск
Эта страница загружает только первые n элементов. Я хочу, чтобы внизу была кнопка «загрузить больше», которая загружает следующие n элементов. (Да, я знаю. Бесконечная прокрутка, вероятно, лучше - это произойдет позже. Даже если бы я использовал бесконечную прокрутку, у меня все равно была бы проблема, которую я собираюсь описать.)
Когда я загружаю больше элементов, страница не обновляется, чтобы показать новые элементы. Я знаю, что Polymer очень внимательно относится к тому, как вы связываете данные, особенно когда это связано с подчиненными свойствами. Это упрощенная версия Javascript, которая касается установки новых элементов в массивы:
setItems: function(newItems) {
var tempYearsArray = [];
for (var i = 0, i < this.years.length; i++) {
tempYearsArray.push(this.years[i]);
}
this.set('years', []);
for (var j = 0; j < newItems.length; j++) {
var item = newItems[j];
this.setMonthAndYear(item, tempYearsArray);
}
this.set('years', tempYearsArray);
}
setMonthAndYear: function(item, tempYearsArray) {
var itemDate = new Date(item.lastModified);
var currentYear = itemDate.getFullYear();
var monthIndex = itemDate.getMonth();
var monthName = this.monthNames[monthIndex];
var newYear = true;
var newMonth = true;
for (var i = 0; i < tempYearsArray.length; i++) {
var year = tempYearsArray[i];
if (currentYear === year.name) {
newYear = false;
for (j = 0, j < year.months.length; j++) {
var month = ref[j];
if (monthName === month.name) {
month.items.push(item);
newMonth = false;
break;
}
}
if (newMonth) {
var month = {
items: [item],
name: monthName
};
year.months.push(month);
}
break;
}
}
if (newYear) {
var month = {
items: [item],
name: monthName
};
year = {
name: currentYear,
months: [month]
};
return tempYearsArray.push(year);
}
}
Я вижу, что years
имеет новые элементы, но страница по-прежнему не отображает их. Я читал другие посты с похожими проблемами, где я получил представление о this.set('years', [])
и временном массиве. Я также пытался делать такие вещи, как this.notifyPath('year.months', year.months.slice())
и this.notifyPath('month.items', month.items.slice())
. Я не уверен, почему это сработает, но я видел, что предложено в этом выпуске Github пост .
Также, если у вас есть лучшее предложение, чем массив лет, который содержит массив месяцев, который содержит массив элементов, тем лучше.