如何使用firebase-document在Polymer 2.x中的空Firebase节点初始化“设置”?

时间:2018-03-16 17:11:08

标签: firebase firebase-realtime-database polymer polymer-2.x polymerfire

我想实现<firebase-document>来获取和应用用户设置。 I am using this page as a guide.

当我在firebase中的/users/{{userId}}/settings节点上加载没有数据的页面时,我希望看到加载的对象{ new: 'initial', j: 5, o: 'N' })。但是,我实际上看不到我的firebase中的节点没有变化。

我做错了什么,怎样才能实现我想要的行为?

settings.html
<firebase-document
  path="/users/{{userId}}/settings"
  data="{{data}}">
</firebase-document>

<script>
Polymer({
  properties: {
    uid: String,
    data: {
      type: Object,
      observer: 'dataChanged'
    }
  },

  dataChanged: function (newData, oldData) {
    // if settings have not been set yet, initialize with initial value
    if(!newData && !oldData){
      this.set('data', { new: 'initial', j: 5, o: 'N' });
    }
  }
});
</script>

编辑:通过@HakanC的评论回答问题:

  

执行时{{userId}}是否有值?

  

路径/users/{{userId}}/settings是否有数据?

没有。用户首次登录时没有/settings节点。但我确实有代码可以在/users/{{userId}}成功创建节点。当该元素执行其脚本时,该节点就会出现。

  

控制台记录您是否到达this.set行。

我确实到过那里多次。第一次,data的记录值未定义。第二次,data的记录值为{}

1 个答案:

答案 0 :(得分:1)

如上所述,路径中没有数据,那么您需要更改条件。类似的东西:

if(newData === undefined){

而不是;

if(!newData && !oldData){

编辑:

static get properties() { return { 
            uid: String,
            data:{
               type:Object,
               value() {return{}; }
              }
            }
          }
      static get observers() { return [ 'dataChanged(data)' ]} 


            constructor() {
              super();
            }

            ready() {
                super.ready();
                setTimeout(()=> {
                  this.set('data', undefined); //Retrieving data async from firebase.           
                },500)
            }

    dataChanged(data) {
    // if data has not been set then, initialize with new value
      console.log(data);
      if(!data){
        this.set('data', { new: 'initial', j: 5, o: 'N' });
      }
    }     

DEMO