2016-07-14 11 views
0

Ich habe Probleme, Daten von Firebase zu einem Polymerelement zu bekommen.Daten von Firebase zu Polymer Element abrufen

Hier ist mein Code:

<dom-module id="bb-account-settings"> 

    <template> 

    <style is="custom-style" include="shared-styles"></style> 

       <div class="settings-dialog"> 
        <div class="frame"> 
         <div class="horizontal layout"> 
          <div> 
           <div class="user-image"></div> 
          </div> 
          <div class="horizontal layout"> 
           <paper-input label="First Name" value="{{fNameSet}}"></paper-input> 
           &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 
           <paper-input label="Last Name" value="{{lNameSet}}"></paper-input> 
          </div> 
          <paper-input label="Email" value="{{emailSet}}"></paper-input> 
         </div> 
         <paper-input label="Phone number" value="{{phoneSet}}" allowed-pattern="[0-9]"></paper-input> 
        </div> 
       </div> 

    </template> 
    <script> 

    Polymer({ 

     is: 'bb-account-settings', 

      properties: { 
       fNameSet: { 
        type: String, 
        value: function() { 
         var userId = firebase.auth().currentUser.uid; 
         firebase.database().ref('/user/' + userId + '/UserInfo').once('value').then(function(snapshot) { 
          console.log(snapshot.val().fName) 
          return (snapshot.val().fName); 
         }); 
        } 
       }, 
       lNameSet: { 
        type: String, 
        value: 'test last name' 
        } 
       } 
      } 

    }); 

    </script> 

lNameSEst ist 'test Zuname' und offensichtlich in seinem Eingang ihre Put abgelegt. Sie erwarten, dass fNameSet auf die gleiche Sache, aber nein. Wenn ich es drucke (console.log), heißt es "test first name", aber es wird nicht in seinem Eingabefeld angezeigt!

Ich bin so verwirrt.

+0

Soweit mein Verständnis von js geht, können Sie nicht etwas aus einer Rückruffunktion zurückgeben. – a1626

+0

@ a1626 [diese] (https://www.polymer-project.org/1.0/docs/devguide/properties#configure-values) Seite zeigt, dass ich es richtig mache. –

+0

@ZviKarp haben keine Kenntnisse mit Polymer, aber ich denke, dass Sie beginnen können, [in diesem Beitrag] (https://divshot.com/blog/web-components/building-a-qa-system-with-polymer- and-firebase /) – adolfosrs

Antwort

2

Wie einer der Kommentatoren bemerkt, ist das Zurückgeben eines Werts in einem Rückruf das Problem. Ihre Funktion an Firebase "einmal" -Funktion übergeben wird asynchron & in einem anderen Bereich aufgerufen, so im Grunde verliert es seine Beziehung mit, wo Sie es & der Wert, den Sie zurückgeben, wird nicht, wo Sie erwarten.

Ein etwas Brute-Force-Weg, was Sie bekommen wollen, ist so etwas wie die folgenden Funktionen ausführen:

ready: function() { 
    var userId = firebase.auth().currentUser.uid; 
    firebase.database().ref('/user/' + userId + '/UserInfo').once('value').then(function(snapshot) { 
      console.log(snapshot.val().fName) 
      this.fNameSet = snapshot.val().fName; 
     }.bind(this)); 
} 

Es gibt elegantere Ansätze, aber es ist eine Art aus Rahmen dieser Frage & erfordert eine gewisse Wieder- Strukturierung & tiefer Einblick in die Struktur Ihrer App.

+0

Wow! das hat den Job gemacht! Ich hoffe es war nicht so kompakt. Vielen Dank. –

+0

Großartig und ja, es gibt sauberere Wege, aber es erfordert mehr Ausarbeitung. Das polymerfire-Element, insbesondere das firebase-document-Element, könnte Ihnen Anregungen für einen anderen Ansatz geben. Diese Demo zeigt es in Aktion - https://github.com/firebase/polymerfire/blob/master/demo/note-app.html Denken Sie auch daran, dies als die Antwort auf Ihre Frage zu markieren? – sfeast