2016-12-30 2 views
0

Я использую dom-repeat в Polymer для повторения массива, загруженный из Firebase, и я не могу понять, почему я получаю «ожидаемый массив для элементов, найденный объект» ошибка как показано на скриншоте ниже. Вот код, я использую:Массива из Firbease интерпретируется как объект в Polymer с РОМОМ повторе

<data-firebase data="{{cardsetList}}" requested-location="card-sets" user="{{user}}"></data-firebase> 

    <template is="dom-repeat" items="[[cardsetList]]"> 
     <paper-card image="../images/trip.png" alt="Donuts" class="amber" > 
      <div class="card-content">Test {{index}}</div> 
     </paper-card> 
    </template> 

вид браузера & консоль

enter image description here

данных firebase элемент я создал, который загружает данные из FB, как вы можно увидеть в консоли с успехом (массив из 2 объектов - это то, что я хочу загрузить

Пустой массив перед загрузкой Я проверил, есть ли некоторые данные массива в объекте, который у меня есть перед загрузкой, но, как вы также можете видеть на консоли, это просто пустой массив. Если я перестану загрузки данных из Firebase, нет также никакой ошибки

Значимое массив в Firebase Я также проверил данные в FB, он представлен в виде массива JSON (я могу видеть, что, когда я экспортировать данные, данные экспортируются в скобках массива [])

Проблема: данные загружается, но ошибка сохраняется Как это может быть, что дом повторение происходит (как вы можете видеть, что это оказывается), а также в консоль есть Array, но я все еще получаю эту ошибку?

Большое спасибо!

С наилучшими пожеланиями, Tim

ответ

1

Я понимаю, что нет поддержки массивов в firebase и массивы откладываются в качестве «объекта» с целыми числами как имена ключей.

// we send this 
['hello', 'world'] 
// Firebase stores this 
{0: 'hello', 1: 'world'} 

Смотрите здесь:

https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html

Это выглядит именно то, что вы получаете обратно.

+0

Это правда, оно хранится как объект в Firebase. Но я использую это где-то еще в своем приложении, и он работает, так или иначе, я использую массив, являющийся дочерним объектом. Насколько я понимаю, когда вы снова загружаетесь из Firebase, он преобразуется в массив (как вы можете видеть в консоли, он, кажется, интерпретирует его как массив или нет? Также dom repeat способен обрабатывать его ...) , –

+0

Кроме того, цитата из вашей ссылки: «Однако, чтобы помочь людям, которые хранят массивы в Firebase, когда вы вызываете .val() или используете REST api для чтения данных, если данные похожи на массив, Firebase будет отображать его как массив ». Теперь я не знаю, как Polymer загружается из Firebase, но, как сказано, я испытал, что он работает в других местах, где он обрабатывается как Array (я даже использую сплайсинг и т. Д., И он отлично работает). –

+0

Использование этого дочернего элемента, например. «cardsetList.0.card-items» (который содержит массив), dom-repeat работает и ошибки не появляется. Кажется, что-то нужно делать, как данные решаются на «самом высоком» уровне от полимерного огня ... –

0

Я понял. В начале пользователь, кажется, не обеспечивает достаточно быстро fb-auth. Так как пользователь пуст, firebase пытается загрузить данные из того места, которое не существует, и тем самым создает объект.

Я добавил следующее расчетное связывание:

Функция

 hasContent: function(checkLength) { 
     return checkLength.length > 0 ? checkLength : []; 
    } 

И в HTML

<template is="dom-repeat" items="[[hasContent(cardsetList)]]" as="cardItemLoop"> 
    ... 
</template> 

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

Кроме того, это, кажется, относится к firebase-document defaults to {} before resolving #33

0

Если это не так поздно, чтобы предотвратить запрос, удалить свой путь и позже, когда у вас есть объект аутентификации установить свой путь в JS. Таким образом, ваш запрос не будет иметь пути, а затем позже в вашем теге и в результате успешного обращения к вашему автору, вы установите путь, как показано ниже.

signInFb: function() { 
    this.$.auth.signInWithRedirect().then(function(response) { 
     this.$.yourQueryElementID.path = "your path here" ; 
    }.bind(this)).catch(function(error) { 

    }.bind(this)); 
    }, 

 Смежные вопросы

  • Нет связанных вопросов^_^