1

私はpolymerfire要素のFirebase認証と<firebase-query>を使用するプロジェクトに取り組んでいます。私は、アプリケーション全体の多くの場所でデータバインディングを使用していますが、この問題は発生しませんでした。Firebaseスナップショットからのテキストへのポリマーデータのバインド

私はユーザーが認証されたときに作成されたユーザーオブジェクトを、多くの場所でバインドしてユーザーの名前を受け取ります。次のコードはカスタム要素を示しています。ここでは、ユーザオブジェクトのほかにFirebaseのスナップショットを、タイプObjectのプロパティにバインドしようとしています。

console.log()vidobjプロパティの場合、オブジェクト全体が表示されます。しかし、私はそれを私のテキストに縛ることができません。ただし、同じことがユーザーオブジェクトのプロパティで機能します。

これはPolymerのライフサイクルと関係があると私は信じています。値は後で作成されても自動的に更新されませんか?

次のスクリーンショットは、2 console.log表示「vidobjの内容との を:あなたのFirebaseコールバックのコンテキストは、あなたのポリマーのオブジェクトにバインドされていない

enter image description here

<link rel="import" href="../bower_components/polymer/polymer.html"> 

<dom-module id="my-singlevideo"> 
    <template> 
    <style> 
     :host { 
     display: block; 
     } 
    </style> 

    <firebase-auth user="{{user}}"></firebase-auth> 
    <iron-localstorage 
     id="localstorage" 
     name="my-app-storage" 
     value="{{localUserDetails}}"> 
    </iron-localstorage> 

    <h1>Name: [[user.displayName]]</h1> 
    <h1>Video Title: [[vidobj.title]]</h1> 

    </template> 

    <script> 
    Polymer({ 
    is: 'my-singlevideo', 

    properties: { 
     user: { 
     type: Object, 
     }, 
     localUserDetails: { 
     type: Object, 
     }, 
     vidobj: { 
     type: Object, 
     }, 
    }, 

    ready: function() { 

     this.$.localstorage.reload(); 
     var videoId = this.localUserDetails.lastClickedVid; 

     firebase.database().ref('/videos/' + videoId).once('value', function(snapshot) { 
     this.vidobj = snapshot.val(); 
     console.log(this.vidobj); 
     console.log(this.vidobj.title); 
     }); 
    }, 

    }); 
</script> 
</dom-module> 
+1

データバインディングが 'this.vidobj'を設定した後に自動的に更新されなければなりません。問題はオブジェクトそのものにある可能性があります。 'snapshot.val()'の内容を表示するために質問を更新できますか? 'vidobj'は他のものによって設定されていますか(バインディングか質問に表示されないコールバックを介して)? – tony19

+0

@ tony19迅速な対応に感謝します。私はvidobjでコンソールログを追加しました。このコードは、vidobjに関連するすべてを示しています。 私はlocalstorageから鍵を取得していますが、これでfirebaseデータベース要求を作成しています。結果はvidobj内で終わる。 – Niklas

+0

ああ、私は問題を見る。コールバックのコンテキスト。縛られていない。 – tony19

答えて

1

ので、あなた」実際にvidobjを外側のコンテキスト(通常Windowオブジェクト)に設定し直してください。この問題を解決するには

、このようFunction#bindを使用します。

ready: function() { 
    // ... 
    firebase.database().ref('/videos/' + videoId).once('value', 
    function(snapshot) { 
     this.vidobj = snapshot.val(); 
     console.log(this.vidobj); 
     console.log(this.vidobj.title); 
    }.bind(this) 
); 
} 
+0

ありがとう、訂正と解決策。私はbind()関数を読まなければならなかった。不足している知識を持つ他の人がこれを見つけなければならない。ここにMDNのリンクがあります。https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Function/bind – Niklas

+1

@NiklasLang問題はありません。私は実際に数分前に答えへのリンクを追加しました。 :) – tony19

関連する問題