ValueChanges& SnapshotChanges,使用Firebase AngularFire2

时间:2017-11-04 20:07:49

标签: angularjs firebase rxjs angularfire2 angular2-observables

我们在最近对AngularFire如何处理对象/列表以及引用整个应用程序中的对象的过程中遇到了一些严重问题。

主要的是旧的AngularFireObject & AngularFireList与新的$key相比如何运作。我们的应用程序高度依赖于$key值,因为我们广泛地进行了非规范化(如推荐)。

现在,文档使用地图示例来获取valueChanges()值,但该功能并不相同,甚至/* /items/ a/{name: 'Dennis', city: 'Dallas'} b/{name: 'Katie', city: 'Austin'} c/{name: 'Will', city: 'Chicago'} */ let myAfList = this.af.list('path/to/items'); let itemsFirst, itemsSecond, itemsThird; myAfList.subscribe(items => itemsFirst = items); setTimeout(_ => myAfList.subscribe(items => itemsSecond = items), 1000); setTimeout(_ => myAfList.subscribe(items => itemsThird = items), 2000); /* Results for all three item arrays itemsFirst: [ {name: 'Dennis', city: 'Dallas', $key: 'a'}, {name: 'Katie', city: 'Austin', $key: 'b'} {name: 'Will', city: 'Chicago', $key: 'c'} ]; */ 似乎也不起作用。

我不完全确定我们现在应该做些什么改变。

考虑:

旧路

let myAfList = this.af.list('path/to/items').valueChanges();
let itemsFirst, itemsSecond, itemsThird;

myAfList.subscribe(items => itemsFirst = items);

setTimeout(_ => myAfList.subscribe(items => itemsSecond = items), 1000);
setTimeout(_ => myAfList.subscribe(items => itemsThird = items), 2000);

/* Results for ONLY itemsFirst
    itemsFirst: [
        {name: 'Dennis', city: 'Dallas'},
        {name: 'Katie', city: 'Austin'}
        {name: 'Will', city: 'Chicago'}
    ];
*/

所有三个订阅都正确获取完整的项目数组,并设置为收听未来的更改

价值变化的新方法:

ItemsFirst

let myAfList = this.af.list('path/to/items').snapshotChanges() .map(actions => { return actions.map(action => { const $key = action.payload.key; const data = { $key, ...action.payload.val() }; return data; }); }); let itemsFirst, itemsSecond, itemsThird; myAfList.subscribe(items => itemsFirst = items); setTimeout(_ => myAfList.subscribe(items => itemsSecond = items), 1000); setTimeout(_ => myAfList.subscribe(items => itemsThird = items), 2000); /* Results for ONLY itemsFirst itemsFirst: [ {name: 'Dennis', city: 'Dallas', $key: a}, {name: 'Katie', city: 'Austin', $key: b} {name: 'Will', city: 'Chicago', $key: c} ]; */ ,因为第一个订阅正确获取了这些项目。其他两个项目什么都没有,但三个都订阅了未来的更改。没有关键值。

使用$ key

的地图
$key

let myAfList = this.af.list('path/to/items'); myAfList.valueChanges().subscribe(items => itemsFirst = items); 现在列在列表中,但同样只在第一个项目列表中...

所以快速观察一下,对象现在是围绕核心firebase引用的非常简单的包装器,而valueChanges()需要移动到子端,如:

require_relative 'helper_method'
include Helper

post '/new_user' do
  add_table(params[:username])
  redirect '/index' 
end

这个有效!好极了!但关键呢?好吧,我必须一遍又一遍地写出地图功能。或者创建我自己的函数,但它不在对象proto上,所以我必须将它添加到我在其中使用的每个文件中...

我错过了什么?获取$ key的正确方法是什么,订阅总是获得完整的值?

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您可能想要探索这种可能性:

// Generate a reference to a new location and add some data using push()
var newPostRef = postsRef.push();

// Get the unique key generated by push()
var postId = newPostRef.key;

source