0

我有 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'

我想做的是当一个模型中的一个模型在一个集合中更改时,我也想更新另一个集合中的另一个模型

这些集合可能包含也可能不包含相同的模型。

因此,假设@posts 中的模型在我的 Post 模型中发生了变化,我也想在 @followed_posts 中更新该模型。如果@followed_posts 没有该模型,我需要将模型的副本添加到@followed_posts 集合。

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

4

2 回答 2

3

如果这两个集合是反社会的并且不能直接相互交谈,这通常是好的设计,那么你需要一个中介——一个全局事件调度器。当模型更改时,将该事件连同对该模型的引用一起传播到调度程序。侦听其他集合中的事件并使用传递的模型来检查是否存在并根据需要进行响应。

编辑:

Backbone 的文档提到了这种模式:

例如,要制作一个方便的事件调度器,它可以在应用程序的不同区域之间协调事件: var dispatcher = _.clone(Backbone.Events)

但事实上,这是一种常见的模式,Backbone 对象本身是用 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

另外,关注的帖子是帖子的子集吗?如果是这样,为什么不在模型上添加一个属性来指定它呢?然后,您可以使用简单的过滤功能找到所有关注的帖子。

于 2013-02-17T23:00:08.260 回答
1

我强烈建议您应该考虑拥有一个集合并在模型中添加某种属性来区分它们是什么类型的帖子。

于 2013-02-18T06:03:57.973 回答