Как определить, когда Polymer завершен со всей привязкой данных?

#polymer

#полимер

Вопрос:

Допустим, у меня есть элемент Polymer x-foo , который использует шаблоны для привязки данных.

 <template>
  <!--shadow DOM-->
  <template repeat='{{item in items}}'>
    <div class='content'>{{item}}</div>
  </template>
</template>
  

items это свойство x-foo , которое определяет, что присутствует в представлении.

Теперь, на лету в одном из методов x-foo , которые я делаю:

 this.items = getNewItemList();
  

а затем попытайтесь получить доступ к содержимому shadow DOM,

 this.shadowRoot.querySelectorAll('.content') // was supposed to return 5 elements
  

Я обнаружил, что Polymer все еще не прошел цикл шаблона и не сгенерировал содержимое моего теневого DOM. Есть ли способ узнать, когда он его закончил?

Ответ №1:

По замыслу, Polymer ожидает, пока ваш JavaScript не завершит обработку, прежде чем делать дорогостоящие вещи, такие как возня с DOM. Таким образом, вы можете выполнять несколько операций одновременно и не беспокоиться о том, что DOM будет перегружен и замедлит работу вашего приложения.

Короткий ответ на ваш вопрос — сделать что-то вроде этого:

 this.items = getNewItemList();
this.async(
  // `async` lets the main loop resume and perform tasks, like DOM updates,
  // then it calls your callback 
  function() {
    this.contents = this.shadowRoot.querySelectorAll('.content'); 
  }
);
  

Лучший ответ — избежать необходимости запрашивать элементы. Вместо этого позвольте элементам взаимодействовать с контейнером через события или даже с использованием объектов «item» (модель данных). Если вы сможете управлять своим пользовательским интерфейсом из своей модели данных, а не наоборот, у вас будет лучшее время.