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'

私がやろうとしているのは、あるコレクションでモデルの1つが変更されたときに、他のコレクションの他のモデルも更新したいということです。

これらのコレクションは、同じモデルを保持している場合と保持していない場合があります。

@posts のモデルが Post モデルで変更された場合、@followed_posts のモデルも更新したいとします。@followed_posts にそのモデルがない場合は、モデルの複製を @followed_posts コレクションに追加する必要があります。

モデルが属するコレクションにはアクセスできますが、他のコレクションにはアクセスできません。任意のアイデアをいただければ幸いです。

4

2 に答える 2

3

2 つのコレクションが反社会的であり、互いに直接対話できない場合 (通常はこれが適切な設計です)、仲介者 (グローバル イベント ディスパッチャー) が必要になります。モデルが変更されたら、そのイベントをモデルへの参照とともにディスパッチャーに伝達します。他のコレクションのイベントをリッスンし、渡されたモデルを使用して存在を確認し、必要に応じて応答します。

編集:

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 に答える