Как создать простую область применения в полимерном дом-повторе

Я ищу простой способ создать область внутри dom-repeat, В приведенном ниже примере у меня есть список userIds (Например: [12,34,45]). Я хочу пройтись по каждому элементу и извлечь объект пользователя из базы данных firebase. Наконец, я хочу напечатать имя пользователя.

Моя проблема: внутри шаблона не создается область видимости. Следовательно {{user}} Объект всегда будет перезаписан, и на всех отпечатках будет отображаться одно и то же имя пользователя.

Текущее решение: создайте новый веб-компонент (полимерный элемент), который занимает userId в качестве аргумента. Сам элемент будет затем использовать <firebase-document> и печатает имя пользователя.

<template is="dom-repeat" items="[[userIds]]">
    <firebase-document path="/users/[[userId]]" data="{{user}}"></firebase-document>
    User's name is [[user.name]]
</template>

2 ответа

Вы можете получить имя пользователя, похожее на приведенное ниже, при подключении к базе данных. async задача.

var users= [];
var db = firebase.database();
arr.forEach( (uid, inx )=>{                                                                                
    db.ref('users/'+ uid).once('value', snapshot=>{                                                                                                         
    if(snapshot.exists()) {                                                                                                                           
        users.push(snapshot.val().name);                                                                                                                              
    }
  if (inx == arr.length-1) { this.set('users', users) } // in order to list at dom-repeat                                                                                                                                                                                                                                                                                   
});

Вы можете связать выходные данные каждой итерации с переменной итератора (указанной <dom-repeat>.as свойство(по умолчанию это "элемент"), но переменная должна быть объектом.

  1. Оберните элементы (в userIds) в объекты:

    <template is="dom-repeat" items="[[_wrap(userIds)]]">...</template>
    
    // in Polymer element
    _wrap(userIds) {
      return userIds.map(userId => ({userId}));
    }
    
  2. Ссылка на этот недавно обернутый элемент в шаблоне:

    <firebase-document path="/users/[[item.userId]]" ...>
    
  3. Присоедините вывод к переменной итератора, item, используя фигурные скобки:

    <firebase-document data="{{item.user}}" ...>
    
  4. Обновите свое использование вывода для ссылки на переменную итератора:

    <div>User's name is [[item.user.name]]</div>
    

Окончательный код должен быть похож на это:

<template is="dom-repeat" items="[[_wrap(userIds)]]">
  <firebase-document path="/users/[[item.userId]]" data="{{item.user}}"></firebase-document>
  <div>User's name is [[item.user.name]]</div>
</template>

демонстрация

Другие вопросы по тегам