我们在最近对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
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的正确方法是什么,订阅总是获得完整的值?
有更好的方法吗?
答案 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;