0

ユーザー ログイン イベント後のページの最初の読み込みitems時に、Firebase に保存されている一連のオブジェクトをプロパティに入力したいと考えています。

Aは私の望ましい行動を達成します。

<firebase-query
    id="query"
    ...
    path="users/[[user.uid]]/widgets"
    data="{{items}}">
</firebase-query>

Bはしません。

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

Bを使用すると、オブジェクトが読み込まれることを期待していitemsますが、itemsオブジェクトは null です。ただし、ブラウザーを手動で (ログアウトせずに) 更新すると、要素は期待どおりに動作します。ただし、ログアウトすると(ログアウト中に更新すると)、再度リロードするまで問題が再発します。ここで説明されているように、アプリがリセットされないという事実の一部が原因で、ログアウトしてから再度ログインしても問題が再発しないと思います。

なぜAが機能するのですか? しかし、Bではありませんか?また、B を機能させるには、 Bにどのような変更を加える必要がありますか? widgets(パスからのパスを保存したいので、root/widgets/その詳細をusers/...パスの下に保存する必要はありません。

以前の失敗した試行

私の現在の (証明されていない) 理論は、Bの場合(URL が定数/静的である場合、つまりwidgets/)firebase-queryはある種の競合状態に関与するというものです。ライフサイクルイベントの後にのみデータを取得し、データの再取得を試みません。一方、属性のデータバインディングに基づいてパスが動的に更新されると、 は再取得を試みfirebase-query ますpath(つまり、path="users/[[user.uid]]/widgets")。この理論は正しいですか?それとも他に何か原因があるのでしょうか? イベント後にデータを強制的に取得する必要がありますか? もしそうなら、どうすればこれをすべて達成できますか?

次のアイデアを試してみましたが、成功しませんでした。

user: {
  type: Object,
  notify: true,
  observer: '_userChanged',
},

_userChanged: function() {
  this.$.query.path = 'widgets';
  var items = this.$.query.ref.child('widgets');
  this.set('items', items);
},
D
<firebase-query
    id="query"
    ...
    path="[[path]]"
    data="{{items}}">
</firebase-query>

<script>
...
  properties: {
    path: {
      type: String,
      value: function() {
        return 'widgets';
      },
    }
  },
...
</script>

また、Polymer Slack サイトで、@will-in-china は次のように述べています。

初めてデータをロードするときに問題が発生しました。同じパスへの参照が複数ない場合、この問題は発生しないことがわかりました。

path="widgets"要素 (およびアプリ)内の要素内のパスへの参照が 1 つしかないため、このコンテキストでそれが何を意味するのかわかりませんfirebase-query

4

3 に答える 3

0

これはあなたの特定の問題だとは思いませんが、ログイン後 -> setNewRoute(nextPage) レンダリングを取得せず、後続のテンプレート ( Iron-Ajax ) をオブザーバー経由ではなく手動で起動するように変更したという点で似ている可能性があります。

  loggon: function parseLogin(user, password) {
...

     Parse.User.logIn(_user, _pass).then(function() {
      page('/channels');

---
channels.render ...

      _render: function() {
        console.log('_render');
        this.$.get_channlinq.headers = hdr;
        //xhr params
        var body = this._setQry(this.params.channelId);
        this.$.get_channlinq.body = JSON.stringify(body);
        //fetch , load , template will render
        this.$.get_channlinq.generateRequest(); 
于 2016-12-04T14:38:57.350 に答える
0

「A を使用する場合、項目オブジェクトが読み込まれることを期待していますが、代わりに項目オブジェクトが null です。ただし、ブラウザーを手動で (ログアウトせずに) 更新すると、要素は期待どおりに動作します。ただし、ログアウトすると (その後更新します)ログアウトしている間)、再度リロードするまで問題が再発します。」

私のアプリでも同様の動作が見られます。私の場合、それは firebase-auth と firebase-query の競合状態に関連しています。私の場合、

  1. ログインすると、firebase-auth が同時に、または firebase-query の後に発火します。この場合、権限が無効なため、クエリが拒否されました。認証される前にクエリを実行しています。エラー ログの抜粋:

    「詳細: エラー: /parents で許可が拒否されました: クライアントには目的のデータにアクセスする権限がありません。...、タイプ: "エラー"、ターゲット: firebase-query .... 認証が完了した後、firebase-query は再試行しません。これがバグかどうかはわかりません。

  2. ログイン後に更新すると、すでに認証されているため、クエリは成功しています。

この問題をデバッグするために、on-error ハンドラーを追加してアクセス許可を出力しました。この問題を回避するために、無効なプロパティを使用しています。ページが最初に読み込まれると、すべてのクエリが無効になります。認証が成功した場合にのみ、「無効」に切り替え、その時点でクエリが正常に起動します。

signIn: function(){
  var email = this.user.email;
  var password = this.user.password;
  this.$.auth.signInWithEmailAndPassword(email, password)
     .then(function(response){
		self.disabled = false;
		// console.log('signin', response);
	 })
	.catch(function(error){
		console.log('auth-element:signIn error is', error.detail);
	 })
	.then(function(){
	   // call other functions
	});
 },
handleError: function(error){
  console.log('error message', error.detail.message);
},
<firebase-query
   id = "query"
   app-name="my-app"
   path = "/shoeboxes"
   data = "{{datauid}}"
   on-error="handleError"
   disabled="{{disabled}}">
</firebase-query>

お役に立てれば。基本的に、私はポリマーとfirebaseを使用すると、promiseがautomagicalバインディングよりも優れていることを発見しています...

于 2016-12-09T23:38:54.103 に答える