Angularjs 价值变动及;快照更改,don';使用Firebase AngularFire2无法再获得完整列表

Angularjs 价值变动及;快照更改,don';使用Firebase AngularFire2无法再获得完整列表,angularjs,firebase,rxjs,angularfire2,angular2-observables,Angularjs,Firebase,Rxjs,Angularfire2,Angular2 Observables,最近AngularFire处理对象/列表和在整个应用程序中引用对象的方式发生了一些变化,我们遇到了一些严重的问题 最重要的是,与新的相比,旧的AngularFireObject&AngularFireList是如何工作的。我们的应用程序高度依赖于$key值,因为我们进行了广泛的非规范化(如建议的那样) 现在,文档使用了一个映射示例来获取$key值,但效果不一样,甚至valueChanges()似乎也不一样 我不完全确定我们现在应该如何处理这些变化 考虑: 老路 /*/项目/ a/{name:'D

最近AngularFire处理对象/列表和在整个应用程序中引用对象的方式发生了一些变化,我们遇到了一些严重的问题

最重要的是,与新的相比,旧的
AngularFireObject&AngularFireList
是如何工作的。我们的应用程序高度依赖于
$key
值,因为我们进行了广泛的非规范化(如建议的那样)

现在,文档使用了一个映射示例来获取
$key
值,但效果不一样,甚至
valueChanges()
似乎也不一样

我不完全确定我们现在应该如何处理这些变化

考虑: 老路
/*/项目/
a/{name:'Dennis',city:'Dallas'}
b/{姓名:'Katie',城市:'Austin'}
c/{姓名:'Will',城市:'Chicago'}
*/
让myAfList=this.af.list('path/to/items');
让项目第一,项目第二,项目第三;
订阅(items=>itemsFirst=items);
setTimeout(=>myAfList.subscribe(items=>itemsSecond=items),1000);
setTimeout(=>myAfList.subscribe(items=>itemsThird=items),2000);
/*所有三个项目数组的结果
项目一:[
{姓名:'Dennis',城市:'Dallas',$key:'a'},
{姓名:'Katie',城市:'Austin',$key:'b'}
{name:'Will',city:'Chicago',$key:'c'}
];
*/
所有这三个订阅都正确地获得了完整的项目数组,并设置为侦听将来的更改

价值变化的新方式:
让myAfList=this.af.list('path/to/items').valueChanges();
让项目第一,项目第二,项目第三;
订阅(items=>itemsFirst=items);
setTimeout(=>myAfList.subscribe(items=>itemsSecond=items),1000);
setTimeout(=>myAfList.subscribe(items=>itemsThird=items),2000);
/*仅项目的结果First
项目一:[
{姓名:'丹尼斯',城市:'达拉斯'},
{名字:'Katie',城市:'Austin'}
{名字:'威尔',城市:'芝加哥'}
];
*/
ItemsFirst
作为第一个订阅正确获取项目。其他两个项目什么也得不到,但这三个项目都是为将来的更改订阅的。没有一个具有键值

带$key的地图
let myAfList=this.af.list('path/to/items').snapshotChanges()
.map(操作=>{
返回actions.map(action=>{
const$key=action.payload.key;
const data={$key,…action.payload.val()};
返回数据;
});
});
让项目第一,项目第二,项目第三;
订阅(items=>itemsFirst=items);
setTimeout(=>myAfList.subscribe(items=>itemsSecond=items),1000);
setTimeout(=>myAfList.subscribe(items=>itemsThird=items),2000);
/*仅项目的结果First
项目一:[
{姓名:'Dennis',城市:'Dallas',$key:a},
{姓名:'Katie',城市:'Austin',$key:b}
{name:'Will',city:'Chicago',$key:c}
];
*/
$key
现在在列表中,但它同样只在第一个项目列表中

因此,快速观察是,现在的对象是围绕核心firebase引用的简单包装,valueChanges()需要移动到子端,如:

让myAfList=this.af.list('path/to/items');
myAfList.valueChanges().subscribe(items=>itemsFirst=items);
这管用!耶!但是钥匙呢?在这里,我必须一遍又一遍地写出映射函数。或者创建我自己的函数,但它不在对象原型上,所以我必须将它添加到我使用它的每个文件中

我错过了什么?获取$key的正确方法是什么?订阅是否始终获取完整值


有更好的方法吗?

您可能希望探索这种可能性:

// 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;

更新与推送相比,我们如何简单地获得钥匙?那么你最终做了什么?我现在也被困在这里了。我认为这里的主要问题是,在超时和第一次订阅之间没有任何异步机制。