我想实现<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
的记录值为{}
。
答案 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' });
}
}