2016-07-14 27 views
0

firebaseからポリマーエレメントにデータを取得する際に問題があります。ここでFirebaseからポリマーエレメントにデータを取得

は私のコードです:

<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は、「テスト姓」と明らかに提出し、その入力でプットです。あなたは、fNameSetが同じものだとは思っていますが、そうではありません。私はそれを印刷すると(console.log)、 'test first name'と表示されますが、入力フィールドには表示されません!

私はとても混乱しています。

+0

jsについて私が理解している限り、コールバック関数から何かを返すことはできません。 – a1626

+0

@ a1626 [this](https://www.polymer-project.org/1.0/docs/devguide/properties#configure-values)サイトは、私が正しい方法で行っていることを示しています。 –

+0

@ZviKarpはポリマーに関する知識がありませんが、あなたは[この投稿](https://divshot.com/blog/web-components/building-a-qa-system-with- polymer- – adolfosrs

答えて

2

コメント欄の1人が​​気づいたように、コールバックで値を返すことが問題です。 firebaseの "once"関数に渡された関数は、非同期で&という別のスコープで呼び出されます。したがって、基本的には、宣言した場所との関係が失われます。&返す値は、

あなたが望む結果を得るために、やや強引な方法は、以下のような何かをすることです:

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)); 
} 

あり、よりエレガントなアプローチがあるが、それは一種のこの質問&の範囲外であることは、いくつかの再を必要とし&あなたのアプリの構造を深く理解することができます。

+0

うわー!それは仕事をした!私はそれが圧縮されていないことを願っています。ありがとう。 –

+0

偉大な&ええ、より洗練された方法がありますが、それはより精巧にする必要があります。ポリマーファイア要素、特にfirebase-document要素は、別のアプローチのインスピレーションを与えるかもしれません。このデモでは、実際の動作を示しています - https://github.com/firebase/polymerfire/blob/master/demo/note-app.htmlこれをあなたの質問の答えとしておきましょうか? – sfeast

関連する問題