0

在用户登录事件后第一次加载页面时,我想items用存储在我的 Firebase 中的一组对象填充属性。

A实现了我想要的行为。

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

B没有。

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

使用B时,我希望看到items对象填充,但items对象为空。但是,如果我手动刷新浏览器(不注销),则该元素的行为符合预期。但是,如果我注销(然后注销时刷新),问题会再次出现,直到我再次重新加载。如果我只注销然后重新登录,问题不会再次出现,我认为,部分原因是应用程序没有按照此处所述重置

为什么A有效?但不是B吗?我必须对B进行哪些修改才能使其正常工作?(因为我想存储widgets来自root/widgets/路径的信息,而不必在users/...路径下存储该详细信息。

以前不成功的尝试

我目前的(未经证实的)理论是,在B的情况下(当 URL 是常量/静态时,即widgets/firebase-query涉及某种竞争条件;并且仅在某些生命周期事件之后获取数据,并且不会尝试重新获取数据。另一方面,当基于属性中的数据绑定(即)动态更新路径时,firebase-query 确实会尝试重新获取。这个理论正确吗?还是有其他原因?在某些事件之后我是否需要强制获取数据?如果是这样,我该如何完成这一切?pathpath="users/[[user.uid]]/widgets"

我尝试了以下想法但没有成功。

C
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"内部路径的引用firebase-query

4

3 回答 3

0

“使用 A 时,我希望看到项目对象填充,但项目对象为空。但是,如果我手动刷新浏览器(不注销),则元素的行为符合预期。但是,如果我注销(然后刷新注销时),问题再次出现,直到我再次重新加载。”

我在我的应用程序中看到了类似的行为。就我而言,它与 firebase-auth 和 firebase-query 竞争条件有关。就我而言,

  1. 当我登录时,firebase-auth 同时/在 firebase-query 之后触发。在这种情况下,我的查询由于权限无效而被拒绝 - 我在进行身份验证之前正在查询。错误日志摘录:

    “详细信息:错误:permission_denied at /parents:客户端无权访问所需数据。...,类型:“错误”,目标:firebase-query ....firebase-query 在身份验证完成后不会重试。我不知道这是否是一个错误。

  2. 当我登录后刷新时,由于我已经通过了身份验证,所以查询成功。

为了调试这个问题,我添加了一个错误处理程序来打印权限。为了解决这个问题,我使用了 disabled 属性。首次加载页面时,所有查询都被禁用。只有当身份验证成功时,我才会切换“禁用”,此时查询会成功触发。

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>

希望这可以帮助。基本上,我发现使用聚合物和火力基地,承诺比自动绑定更好......

于 2016-12-09T23:38:54.103 回答
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 回答
-1

I'm coming late but I resolve this using dom-if condition if user this prevent make a request if no are an user authenticate

于 2017-03-23T23:12:43.357 回答