Polymer 2.0 динамически присваивает идентификатор для <ul>в шаблоне dom-repeat возвращает нуль в методе наблюдения в массиве с использованием this.shadowRoot.querySelector () - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь реализовать Sortablejs в приложении Polymer2.0, где я динамически назначаю идентификаторы элементу ul в шаблоне повторения dom.

Проблема в том, что я не могу получить доступ к ul с идентификатором в методе наблюдателя списка задач.

Я пробовал document.getElementId, this. $. QuerySelector, но оба возвращают null, а метод создания Sortablejs выдает ошибку, что требуется html el. Я также попытался this.shadowRoot.querySelector (child.id) ... он также возвратил ноль.

Я борюсь с прошлыми 2 днями, чтобы заставить это работать. что мне нужно сделать, чтобы это исправить? Помогите пожалуйста.

<!DOCTYPE html>

<dom-module id="t-page">
<script src="http://SortableJS.github.io/Sortable/Sortable.js"> . 
</script>

<template is="dom-bind">
<style include="shared-styles">
 ....
</style>

<div class="board­__sprint">
  <template is="dom-repeat" items="{{todos}}" as="row">
    <div class="list">
      <div class="list­-content">
          <ul id="[[row.id]]"> 
          <!-- id is v789878 (some random unique number prefix by v per row -->
            <template is="dom-repeat" items="{{row.tasks}}" as="todo">
              <li>
                <div class="ticket" data-index$="{{todo.id}}">
                  <paper-card style="float:center; width: 100%;" class="singleColor" data-index$="{{todo}}"
                    data-index$="{{row}}">
                        <h7 class="banksTitle" style="color: black; font-size: 12px; text-align:left;">
                          <b>[{{index}}]</b> &nbsp; &nbsp; [[todo.actTitle]]
                        </h7>
                        <h7 class="banksTitle" style="color: grey; font-size: 12px; text-align:left;">
                          [[todo.actDesc]]
                        </h7>
                  </paper-card>
                </div>
              </li>
            </template>
          </ul>
        </div>

        <div class="addTicket">
          <paper-button raised class="blue" on-tap="_addTicketDialog" row={{row}}>Add Ticket</paper-button>
        </div>
      </div>
    </div>
  </template>
</div>

 <script>
  /**
   * @polymer
   * @extends HTMLElement
   */
  class TPage extends Polymer.Element {

  static get is() {
    return 't-page';
  }

  static get properties() {
    return {
      todos: {
        type: Object,
        notify: true,
        observer: '_todosChanged'
      },
   ....
   }

   _todosChanged() {
    console.log('this.todos.length = ' + this.todos.length);
    if (this.todos !== null || this.todos !== undefined) {
      var self = this;
      this.todos.forEach(function (child) {
       Sortable.create(self.$.querySelector(child.id), {
          group: 'shared'
        });
      });
    }
  }

window.customElements.define(TPage.is, TPage);

1 Ответ

1 голос
/ 25 апреля 2019

Для выбора элемента есть три пункта:

  1. Стандарты идентификаторов: Значение должно быть уникальным среди всех идентификаторов в домашнем поддереве элемента и должно содержать не менее one character. Значение не должно содержать пробелов ...
 <ul id="myid[[row.id]]"> 
  1. Рендеринг времени дом-повтора. Для этого вы можете обернуть вашу функцию setTimeout, чтобы убедиться, что все ваши элементы отображаются в dom-repeat.
_todosChanged() {
        setTimeout(()=>{ 
            console.log('this.todos.length = ' + this.todos.length);
            if (this.todos !== null || this.todos !== undefined) {
               var self = this
              this.todos.forEach(child=> {
               console.log(child.id)
               var selector = this.shadowRoot.querySelector('#myid'+child.id);
               Sortable.create(selector, {
                  group: 'shared'
                });
              });
            }
          })
}
  1. Контекст вашей функции не привязан к объекту Polymer, поэтому самое короткое решение - использовать функцию массива (ES6):
this.todos.forEach(child=> {....

вместо:

this.todos.forEach(function (child) {...

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...