AngularFire:如何通过扩展服务和使用 $$updated 私有方法来更新 $firebaseArray
AngularFire: How to update a $firebaseArray by extending the service and using the $$updated private method
我的数据库中有两个单独的 Post 列表和作者列表,每个 Post 包含一个 authorId 以引用相应的作者。
以下方法通过系统地包括每个 Post 的作者姓名来帮助我检索整个 Post 列表:
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 方法的内容而绞尽脑汁:添加新的 Post 时,列表会按预期更新(通过 $$added 方法)。但是当 Post 数据发生变化时(例如 post 标题),我的列表不会更新,因为我目前在 $$updated 方法中返回 false。
问题:$$updated 方法中应该包含哪些内容,以便当 Post 数据发生变化时,我的列表会相应更新(以及 returns 作者的姓名!)。谢谢
我认为您要经历太多循环才能完成一些简单的事情。
如果作者的名字是 "part of" 文章,那么您应该保存它:
{
"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
中,您需要 return 一个布尔值来说明记录是否更改,而不是记录本身。
请记住,如果你走那条路,你不应该使用 $firebaseArray
的默认 $save()
方法,因为它也会保存完整的 authorData
$$updated: function(snap) {
// boolean for the $$updated method
var rec = $firebaseArray.prototype.$$updated.call(this, snap);
// existing record as per this
var existingRecord = this.$getRecord(snap.key());
// record as per FB database
var updatedRecord = snap.val();
if ( rec ) {
FirebaseFactory.$getAuthorId( updatedRecord.authorId )
.$loaded(function( authorData ) {
updatedRecord.authorData = authorData;
angular.extend(existingRecord, updatedRecord);
});
} // end if loop
return rec;
}
我的数据库中有两个单独的 Post 列表和作者列表,每个 Post 包含一个 authorId 以引用相应的作者。
以下方法通过系统地包括每个 Post 的作者姓名来帮助我检索整个 Post 列表:
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 方法的内容而绞尽脑汁:添加新的 Post 时,列表会按预期更新(通过 $$added 方法)。但是当 Post 数据发生变化时(例如 post 标题),我的列表不会更新,因为我目前在 $$updated 方法中返回 false。
问题:$$updated 方法中应该包含哪些内容,以便当 Post 数据发生变化时,我的列表会相应更新(以及 returns 作者的姓名!)。谢谢
我认为您要经历太多循环才能完成一些简单的事情。
如果作者的名字是 "part of" 文章,那么您应该保存它:
{
"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
中,您需要 return 一个布尔值来说明记录是否更改,而不是记录本身。
请记住,如果你走那条路,你不应该使用 $firebaseArray
的默认 $save()
方法,因为它也会保存完整的 authorData
$$updated: function(snap) {
// boolean for the $$updated method
var rec = $firebaseArray.prototype.$$updated.call(this, snap);
// existing record as per this
var existingRecord = this.$getRecord(snap.key());
// record as per FB database
var updatedRecord = snap.val();
if ( rec ) {
FirebaseFactory.$getAuthorId( updatedRecord.authorId )
.$loaded(function( authorData ) {
updatedRecord.authorData = authorData;
angular.extend(existingRecord, updatedRecord);
});
} // end if loop
return rec;
}