我的数据库中有两个单独的Posts和Authors列表,每个Post包含一个authorId来引用相应的作者。
以下方法通过系统地包括每个帖子的作者姓名来帮助我检索整个帖子列表:
app.factory('NormalizedPosts', function($firebaseArray, FirebaseFactory) {
var PostsWithAuthors = $firebaseArray.$extend({
// override $$added to include author name
$$added: function(snap) {
var record = $firebaseArray.prototype.$$added.call(this, snap);
FirebaseFactory.$getAuthorId( record.authorId ).$loaded(function( authorData ) {
record.authorData = authorData;
});
return record;
},
// ????????
$$updated: function(snap) {
var rec = $firebaseArray.prototype.$$updated.call(this, snap);
var updatedRecord = this.$getRecord(snap.key());
FirebaseFactory.$getAuthorId( updatedRecord.authorId )
.$loaded(function( authorData ) {
rec.authorData = authorData;
});
return rec;
}
});
return PostsWithAuthors;
});
PS:FirebaseFactory只是Firebase方法的包装。
然后我打电话
var list = new NormalizedPosts ( new Firebase(FBURL).child("posts") );
在我的控制器中以获取完整列表。这很好用。
我正在摸索应使用$$ updated方法的内容:添加新的帖子后,列表将按预期方式更新(通过$$ add方法)。但是,当Post数据(例如,帖子标题)发生变化时,我的列表不会得到更新,因为我当前在$$ updated方法中返回false。
问题:$$ updated方法中应该包含什么内容,以便在Post数据发生更改时,我的列表也会得到相应的更新(并进一步返回作者的名字!)。谢谢
我认为您要经历太多循环才能完成一些简单的事情。
如果作者名称是文章的“一部分”,则应保存该文章:
{
"articles": {
"firebase-uniq-id-1": {
"title": "My Writing Process",
"published": "2016-01-01",
"author": {
"firebase-uniq-id-2": "Ernest Hemingway"
}
}
},
"authors": {
"firebase-uniq-id-2": {
"name": "Ernest Hemingway",
"born": "1899-07-21",
"whatever": "Some Data"
}
}
}
当您想显示有关作者的其他详细信息时,请提取它。
编辑:如果您仍然希望使用扩展选项,我相信你唯一缺少的存在扩展updateRecord
与rec
:
FirebaseFactory.$getAuthorId( updatedRecord.authorId )
.$loaded(function( authorData ) {
updatedRecord.authorData = authorData;
angular.extend(updatedRecord, snap.val());
});
同样,$$updated
您需要返回布尔值,说明记录是否更改,而不是记录本身。
请记住,如果您选择该路径,则不应使用默认$save()
方法,$firebaseArray
因为它还会保存完整的authorData
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句