3

私はやや大規模なバックボーン ベースの Web アプリを実行しており、バックボーン リレーショナルを使用しています。一対多の関係でカスタム関数を使用できるかどうか疑問に思っていました。

IE 国モデルがあり、それが複数のメタデータ モデル (それぞれが型属性を持つ) に関連している場合、関連するコレクションを特定の型にフィルター処理する関数を作成したいと考えています。これは最良の例ではありません (プロジェクトの詳細について公に言及したくありません) が、ここに私が作成したサンプル コードを示します (100% 正しいとは限りませんが、アイデアは理解できます)。

var Country = Backbone.RelationalModel.extend({

  relations: [
    {
      type: Backbone.HasMany,
      key: 'metas',
      relatedModel: Metadata,
      collectionType: MetadataCollection,
      reverseRelation: {
        key: 'country',
        includeInJSON: '_id'
      }
    }
  ]

});

var Metadata = Backbone.RelationalModel.extend({

  subModelTypes: {
    'landmark' : 'Landmark',
    'city' : 'City'
  }

});

var Landmark = Metadata.extend({});
var City = Metadata.extend({})

var MetadataCollection = Backbone.Collection.extend({

  model: Metadata,

  filterType: function(type){
    this.filter(function(meta){
      return meta.get('type') === type;
    })
  }

});

var Countries = Backbone.Collection.extend({

  model: Country

})

var countries = new Countries([
  {
    name: 'Australia',
    metas: [
      {
        type: 'landmark',
        name: 'Uluru'
      },
      {
        type: 'landmark',
        name: 'Sydney Opera House'
      },
      {
        type: 'city',
        name: 'Sydney'
      }
    ]
  }  
]);

countries.get(1).get('metas').filterType('landmark')
// TypeError: Object [object Object] has no method 'filterType'

あなたがこれを行うことができるかどうか誰かが知っていますか?これを行う別の良い方法があれば (同じコレクションに異なる型を保持しながら)、知りたいです。

ありがとう!

4

2 に答える 2

1

コレクションのプロキシとして機能する別のオブジェクトを作成する一般的なパターン。プロキシには、基本コレクションへの参照と、削減されたセットを含む独自のコレクションが含まれています。次に、このプロキシはベース コレクションのイベントをリッスンし、それに応じてフィルター処理されたコレクションを更新し、必要に応じてイベントを転送します。これを使用して、通常どおりベース コレクションからモデルを追加、更新、および削除し、必要に応じてプロキシ自体を更新し、ビューまたはフィルタリングされたコレクションを消費しているものをプロキシに結び付けます。

手動で行うのは少し面倒でエラーが発生しやすいため、次のライブラリを使用することをお勧めします: https://github.com/jmorrell/backbone.obscura

リレーショナル データベース内のビューの概念に精通している場合、これは同じ考え方です。

于 2013-12-10T04:18:44.360 に答える