2011-11-15 28 views
0

モデルのタイプに応じていくつかのビューに拡張されたビューが必要です。Backbone.jsビューの階層構造の実装

var AnimalView = Backbone.View.extend({.....}); 
var DogView = AnimalView.extend({......}); 
var CatView = AnimalView.extend({.....}); 

しかし、私が本当にしたいAnimalViewは、種の結果を決定する必要があります:

var AnimalView = Backbone.View.extend({ 
initialize : function(){ 
    if (this.model.get("species")=="dog"){this = new DogView({model:this.model});} 
    if (this.model.get("species")=="cat"){this = new CatView({model:this.model});} 
}) 
}); 

私は、これは動作しません実現が、それは私が持っているしたい考えです。

if (pet.get("species")=="dog"){petVeiw = new DogView({model:pet})} 
else if (pet.get("species")=="cat"){petVeiw = new CatView({model:pet})} 

をしかし、私は親ビュー、つまりAnimalViewでそのロジックを分離したいと思います:

私はこれを行うことができます。

これを行う最善の方法に関するアイデアはありますか?

答えて

1

本当にそのパターンが見える場合は考えられません。私は、ある種のファクトリクラスがオブジェクトを取得し、そのオブジェクトと一緒に作成する他のクラスを決定する責任があることを見るのがもっと一般的だと言いたいと思います。しかし、私はそれをする親クラスではないと思います。典型的には、そのマッピング操作を担当していた他のオブジェクトです。

の階層があるかもしれませんしながら、そう:

AnimalView 
    | 
    +-- DogView 
    | 
    +-- CatView 

別の目的は、適切なもの(明らかに悪い疑似記述)を生成します:

AnimalFactory 
    AnimalView getViewForAnimal(animal) 

バックボーンは間違いなくあなたがDogViewを作成できるようになりますCatViewは両方ともAnimalViewからの動作を継承しました。おそらく、マップされている一般的なイベントをマップしている共通のイベントを共有しています。異なるイベントやテンプレートを使用しています。私は、親クラスがサブクラスのインスタンス化を行うものであるとは思わないでしょう。