3

Backbone.js を使用して (初めて) かなり単純なアプリケーションを作成しています。現在、1 対多の関係を持つ 2 つのエンティティを扱っています。

  • プロジェクト: 多くのグループがあります
  • グループ:1つのプロジェクトに所属

Backbone 自身の推奨事項から Ligament、Backbone-relational まで、モデル間の関係を表すいくつかの異なる方法を調べました。しかし、最終的には単純な関数呼び出しを使用することにしました。たとえば、私の「プロジェクト」モデル内には、groups() という関数があります。

groups: function() {
  return new Collections.Groups(groups.where({project_id: this.get('id')}));
}

Group モデル内では、次のようになります。

project: function() {
  return projects.where({id: this.get('project_id')})[0];
}

これにより、次のようなことができます。

var foo = new Project();
var foo_groups = foo.groups();
foo_groups.at(0).get('name');

var bar = new Group();
var bar_project = bar.project();
bar_project.get('name');

私にとって、ここでのトレードオフは、プロジェクトのグループを取得するたびに「groups()」関数を呼び出すのに使用される処理時間と、最新の関係を維持するオーバーヘッド (バックボーンリレーショナルなどを使用する場合) です。

この方法でより多くの関係を構築する際に、今後遭遇する可能性のある落とし穴について、誰かがアドバイスしてくれますか? アプリケーションには最終的に、さまざまな 1 対多および多対多の関係を持つ約 6 つのエンティティが含まれます。

4

1 に答える 1

0

プロジェクトグループ

と呼ぶものの実装がありますAutoUpdatedCollection

1 つのクラスのすべてのモデルを含む共有コレクションがあるシナリオで使用します。このコレクションは、共有コレクションが更新されたときに更新する必要があるサブコレクションを設定するために使用されます。

Backbone AutoUpdatedCollectionの実装を確認してください。

あなたの例に従って、と呼ばれる共通/共有コレクションがあると思います。次に、モデルを次のようwindow.groupsに実装します。Project

// code simplified and no tested
var Project = Backbone.Model.extend({
  initialize: function(){
    this.groups =
      new App.AutoUpdatedCollection({
        name:             "Project-" + this.id + "-groups",
        sourceCollection: window.groups,
        filterField:      "project_id",
        filterValue:      this.id
      }).filteredCollection;

    this.groups.on( "add", this.addGroup, this );
    this.groups.on( "remove", this.removeGroup, this );
  }
});

たぶんこれほど単純ではないかもしれませんが、何か問題があれば教えてください。

グループプロジェクト

Group.projectで属性を初期化するだけですGroup.initialize()

var Group = Backbone.Model.extend({
  this.project = window.projects.where({id: this.get('project_id')})[0];
});
于 2012-08-07T19:37:07.477 に答える