Динамически редактировать шаблон железного списка
Во-первых, я знаю, что есть много вопросов о железном списке. Но в основном это касается редактирования элементов, а не целого шаблона в железном списке.
Мой код действительно очень сложный, и публиковать его бессмысленно. Я работаю над таблицами данных, которые используют iron-list
, У меня есть элемент под названием diamond-listing
и внутри этого diamond-listing
я имею iron-list
,
Вы можете изобразить это как: определение родительского элемента <template>
с некоторым содержанием внутри него, и дочерний элемент (diamond-list) будет отображать этот шаблон в виде таблицы
Конечно diamond-listing
используется несколько раз в моем приложении и всегда с другим шаблоном. Например: у пользователей страницы есть столбцы с userID, userName и т. Д., А на страницах станций есть столбцы stationID, адрес и т. Д. С разным количеством столбцов. У каждой страницы есть своя <template>
который я пытаюсь распространять diamond-listing
, Например:
<diamond-listing as="user" id="permissionsTable" type="pagination" pagination-items-per-page="6" header-data="{{headerData}}" address="/user/" loading="{{loading}}">
<div id="test" slot="content">
<template>
<div class="diamond-row" on-tap="_openUrl" info$="/user/[[user.id]]">
<diamond-item text="{{user.username}}"></diamond-item>
<diamond-item text="{{user.partner.name}}"></diamond-item>
</div>
</template>
</div>
</diamond-listing>
То, что мне удалось сделать, это заставить его работать в тени, используя дом <slot>
и просто переписать <template>
внутри <iron-list>
, но здесь мы.. Например, используя Firefox, который не поддерживает веб-компоненты, нет <template>
как ребенок <iron-list>
(потому что нет теневого дома) так что нет способа как обновить <template>
и сделать железный список.
Что я попробовал:
1) Найти шаблон внутри Iron-List и использовать removeChild
а также appendChild
функции.
var test = this.querySelector("#test template");
this.$$("#diamondList").removeChild(this.$$("#diamondList template"));
this.$$("#diamondList").appendChild(test);
Безуспешно.
2) Определить в HTML пустой железный список без какого-либо шаблона внутри него. А затем в JavaScript добавить шаблон динамически. Безуспешно. (Iron-List плачет, требуется шаблон)
3) Создать динамически железный список, используя document.createElement
var test = this.querySelector("#test template");
var list = document.createElement("iron-list");
list.appendChild(test);
list.as = this.as;
list.items = [{"username":"test","partner":{"name":"Test partner","id":1}}];
list.id = "diamondList";
результат: такой же как 2) ...
Есть ли способ, как обновить template
который используется для визуализации всех элементов в iron-list
?
Или создать железный список с определенным шаблоном внутри JS?
Или как-то сделать это с дом-повтором? У меня не будет более 10 наименований в списке, поскольку он полностью разбит на страницы. (это, вероятно, самое простое решение, но я не знаю, как сделать <template>
за каждую итерацию
2 ответа
Использовать dom-if
или использовать hidden
внутри iron-list
,
<iron-list items="[[items]]">
<template>
<template is="dom-if" if="[[item.isType1]]">
<!-- item1 -->
</template>
<template is="dom-if" if="[[item.isType2]]">
<!-- item2 -->
</template>
</template>
</iron-list>
Вот один общий ответ, не знаю, будет ли это работать для вашего случая:
В Polymer рекомендуемый способ манипулирования DOM - манипулирование данными, а не removeChild или appendChild.
Например,
- если у вас есть список пользователей как: var users_array = [....];
создайте железный список как:
<iron-list date="users_array">
<template>
...
<template>
</iron-list>
- добавление и удаление элементов в users_array немедленно повлияет на список железа.