我有2个帖子集和一个模型如下。
# router file
@posts = new MyApp.Collections.PostsCollection()
@posts.reset options.posts
@followed_posts = new MyApp.Collections.PostsCollection()
@followed_posts.reset options.followed_posts
# Post model file
class MyApp.Models.Post extends Backbone.Model
paramRoot: 'post'
follow_post: ->
# ajax call
console.log "_________Index:#{this.collection.indexOf(this);}"
console.log this.collection
console.log "_________Followed:"
console.log @followed_posts
class MyApp.Collections.PostsCollection extends Backbone.Collection
model: MyApp.Models.Post
url: '/posts_all'
我想要做的是当其中一个模型在一个集合中更改时,我想更新其他集合中的其他模型。
这些集合可能包含也可能不包含相同的模型。
所以,假设我的Post模型中@posts中的模型发生了变化,我想在@followed_posts中更新该模型。如果@followed_posts没有该模型,我需要在@followed_posts集合中添加模型的副本。
我可以访问该模型所属的集合,但我无法访问其他集合。 感谢任何想法,谢谢。
答案 0 :(得分:3)
如果这两个集合是反社会的,并且不能直接相互交谈,这通常是好的设计,那么你需要一个中间人 - 一个全局事件调度员。模型更改时,将该事件传播给调度程序以及对模型的引用。在另一个集合中监听事件,并使用传递的模型检查是否存在并根据需要做出响应。
编辑:
Backbone的documentation提到了这种模式:
例如,创建一个可以协调的便捷事件调度程序 应用程序不同区域之间的事件:var dispatcher = _.clone(Backbone.Events)
但事实上,这是Backbone object itself is extended with Events这种常见的模式。所以你可以这样做:
// In your Post model
@on "change", -> Backbone.trigger "post:change", this, @collection
// And then something like this in the collection class definition:
@listenTo Backbone, "post:change", (model, collection) =>
if post = @get model.cid
post.set model.toJSON()
else
@add model
此外,是否发布帖子的一部分?如果是这样,为什么不在模型上加上一个属性来指定它呢?然后你可以找到所有跟随帖子的简单过滤功能。
答案 1 :(得分:1)
我强烈建议您考虑使用单个集合并在模型中添加某种属性,以区分它们是什么类型的帖子。