访问骨干模型内的其他集合

时间:2013-02-17 19:50:16

标签: backbone.js collections model coffeescript

我有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集合中添加模型的副本

我可以访问该模型所属的集合,但我无法访问其他集合。 感谢任何想法,谢谢。

2 个答案:

答案 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)

我强烈建议您考虑使用单个集合并在模型中添加某种属性,以区分它们是什么类型的帖子。