3

私は単純な<firebase-query>タグを持っています<dom-repeat>.. たとえば、いくつかのフィールドをリンクに変換し、いくつかの日付も解析する必要があります。

そのため、準備ができたらデータを取得し、各項目をループして、値の一部を変更する必要があります。

そのために、データの準備ができたときにそれを検出するオブザーバーを用意しました。ただし、その JavaScript 関数からデータをループする方法がわかりません。アイテムは存在しますが、何らかの理由でfor(var i in items)機能しません。

コンポーネントは次のとおりです。

<dom-module id="cool-stuff">

  <template>

    <firebase-query id="query" path="/items" data="{{items}}"></firebase-query>

    <template is="dom-repeat" items="{{items}}" as="item">
      [[item.name]]<br />
      [[item.date]]<br />
    </template>

  </template>

  <script>
    Polymer({
      is: 'ix-table',
      properties: {
        items: {type: Object, observer: "_itemsChanged"},
      }
      itemsChanged: function(data) {
        // how do I loop through the data received from firebase-query?
        console.log(data);
      }
    });
  </script>

</dom-module>

理想的には、オブザーバー関数でやりたいことは次のようなものです。

for(var i in data) {
  obj = data[i];
  obj.name = '<a href="/item/"+obj.key>'+ojb.name+'</a>';
}

しかし、データをループできないようです。

オブザーバー関数内では、次のconsole.log(data)ような奇妙なものを返します。

Array[o]
0: Object (which contains a proper item)
1: Object (same)
2: Object (same)

アップデート:

これは、console.log(data) が返す内容のスクリーンショットです (オブザーバー内から):

ここに画像の説明を入力

配列にはすべてのオブジェクトが取り込まれているように見えますが、Array[0] として表示されます。したがって、それらをループすることはできません。

更新 2:

alfost のおかげで、解決策は次のとおりです。

<script>
  Polymer({
    is: 'ix-table',
    properties: {
      items: {type: Object},

    }
    observers: [
      '_itemsChanged(items.splices)'
    ],
    _itemsChanged: function(changeRecord) {
      if (changeRecord) {
        changeRecord.indexSplices.forEach(function(s) {
          for (var i=0; i<s.addedCount; i++) {
            var index = s.index + i;
            var item = s.object[index];
            console.log('Item ' + item.name + ' added at index ' + index);
            // do whatever needed with the item here:
            this.items[index].name = "New name";
          }
        }, this);
      }
    },
  });
</script>
4

3 に答える 3

4

<firebase-query>結果

<firebase-query>オブジェクトの配列になることに注意してください。データベースの の下に次の項目が含まれているとします/notes/<USER_ID>/

ここに画像の説明を入力

あなた<firebase-query>はこれに似ています:

<firebase-query
    id="query"
    app-name="notes"
    path="/notes/[[user.uid]]"
    data="{{notes}}">
</firebase-query>

(userは にバインドされてい<firebase-auth>.userます)。

ユーザーがログインしていると仮定すると、 は<firebase-query>そのdataプロパティ (つまり、 にバインドnotes) に次の配列を設定します。

ここに画像の説明を入力

$key各オブジェクトには、Firebase コンソールの [データベース] ビューに表示される項目のキーに対応するプロパティが含まれていることに注意してください。

notes次に、次のように直接反復できます<dom-repeat>

<template is="dom-repeat" items="[[notes]]">
  <li>
    <div>key: [[item.$key]]</div>
    <div>body: [[item.body]]</div>
    <div>title: [[item.title]]</div>
  </li>
</template>

HTML 文字列へのバインド

この場合、文字列データ バインディングは文字どおりにレンダリングされることに注意してnameくださいobj.name = '<a href="...">'。代わりに、テンプレートでタグを宣言し、それらのタグ内でkeyおよびnameプロパティをバインドする必要があります。したがって、オブザーバーは次のように置き換えることができます。

<template is="dom-repeat" items="{{items}}" as="item">
  <a href$="/item/[[item.key]]">[[item.name]]</a><br />
  [[item.date]]<br />
</template>

配列の反復

次の注記は、表示する前にデータを変更したい場合にのみ関連します...

配列を反復するときは、反復の順序が保証されないため、回避for..inする必要があります。また、必ずしも気にする必要のない列挙可能なプロパティを反復する可能性があるためです。代わりに、次を使用できますfor..of(アプリで ES6 を使用できると仮定します)。

for (let note of notes) {
  note.title += ' ...';
}

またはArray.prototype.forEach():

notes.forEach(function(note) {
  note.title += ' ...';
});
于 2017-01-03T06:41:32.380 に答える
2

私はあなたと同じ問題に遭遇したと思います。

これは、firebase クエリが配列を取得する方法、ポリマー オブザーバーが機能する方法に由来し、オブジェクトを表示するときに JavaScript コンソールが参照ベースであるという事実によって隠されています。

実際、ここで実際に起こっていることは、firebase クエリが空の配列を作成しており、それがポリマー オブザーバーをトリガーしていることです。

したがって、配列が作成されるとすぐに関数が呼び出されますが、まだ空であり、空であるため反復できません。次に、プリミティブのサブプロパティが正しく表示されている場所にログを記録します (array[0])。

次に、firebase は配列にデータを入力し始めます。配列参照は同じままであるため、ポリマーはオブザーバーを再度起動することはなく、コンソールで配列を表示しようとすると、ログで参照されている配列が表示され、現在はデータが含まれています。

次のように、単純なものの代わりに配列変異オブザーバーを使用することをお勧めします

`properties: {
    items: {type: Object},
  },
,
observers: [
       '_itemsChanged(items.splices)'
],`

オブジェクトが配列に追加されるたびに起動し、必要な作業を行うことができます:)

配列突然変異オブザーバーに関するドキュメントへのリンクがありました:) ポリマー配列突然変異オブザーバー

これで問題が解決することを願っています。良い一日を。

于 2017-01-04T13:54:05.490 に答える