2012-04-03 10 views
32

同じコントローラのコンテンツ配列に異なるオブジェクトを保存し、適切なビューテンプレートを使用してそれぞれをレンダリングしたいと思いますが理想的には同じビューです。Ember.jsを使用してモデルタイプ/オブジェクト値でビューテンプレートを選択

以下のコードを使用してリストオブジェクトを出力しています。彼らは現在同じですが、私は別のものを使用できるようにしたいと思います。

<script type="text/x-handlebars"> 
    {{#each App.simpleRowController}} 
    {{view App.SimpleRowView class="simple-row" contentBinding="this"}} 
    {{/each}} 
</script> 

ビューのカットダウンバージョンは以下のとおりです。私が含まれていない他の機能は、モデルに関係なく、オブジェクトのいずれかで使用できます。だから私は理想的には1つのビューを持っているだろうが(ミックスインに関する記事を読んだことがあるが、そうでないと助けになるかもしれない)。

<script> 
    App.SimpleRowView = Em.View.extend({ 
    templateName: 'simple-row-preview', 
    }); 
</script> 

私の最初のいくつかのテスト異なるオブジェクトタイプを可能に「シンプル・行・プレビュー」内の条件の負荷になってしまった - それはひどい見えました!

コンテンツの配列を反復処理する際に使用されるtemplateNameまたはビューを動的に制御する方法はありますか? 2人の回答者へ

UPDATE

どうもありがとうございましたが。ビューで使用される最終コードは以下のとおりです。私のモデルの中には、似ているものがあり、私のアプリケーションでテンプレート(またはある種の「状態」)を切り替えることができるという考えが好きでした。

<script> 
    App.SimpleRowView = Em.View.extend({ 
    templateName: function() { 
     return Em.getPath(this, 'content.template'); 
    }.property('content.template').cacheable(), 
    _templateChanged: function() { 
     this.rerender(); 
    }.observes('templateName'), 
    // etc. 
    }); 
</script> 

答えて

102

templateNameをプロパティにしてから、コンテンツに基づいて使用するテンプレートを決めることができます。たとえば、これはオブジェクトのタイプに基づいてテンプレートを設定するには、instanceofはを使用しています

App.ItemView = Ember.View.extend({ 
    templateName: function() { 
     if (this.get("content") instanceof App.Foo) { 
      return "foo-item"; 
     } else { 
      return "bar-item"; 
     } 
    }.property().cacheable() 
}); 

ここでは上記の実施例とフィドルです:のソリューションに基づいてhttp://jsfiddle.net/rlivsey/QWR6V/

+2

を見たときに、テンプレートを変更する機能を追加しました、これは、ビューがハンドルバーヘルパーを介して追加されるのではなく、自動的にエバーによってピックアップされるクラスである場合です。その場合、あなたは 'content'や' controller'にアクセスすることができません(ここで議論します:http://stackoverflow.com/questions/15337065/how-to-get-any-controller-instance-from-init-方法の視点)。この場合、私の解決策は、 'controller.content'を監視し、' this.set( 'currentView'、view)を介してこの関数でビューを設定する方法でした。 – vanthome

16

@ rlivsey、私はプロパティの変更は、これは非常に良い答えですが、残念ながらhttp://jsfiddle.net/pangratz666/ux7Qa/

App.ItemView = Ember.View.extend({ 
    templateName: function() { 
     var name = Ember.getPath(this, 'content.name'); 
     return (name.indexOf('foo') !== -1) ? 'foo-item' : 'bar-item'; 
    }.property('content.name').cacheable(), 

    _templateChanged: function() { 
     this.rerender(); 
    }.observes('templateName') 
}); 
+0

注:これはもう動作しません。ビューは、破棄されているときにレンダリングされることがあり、エラーが発生します。 –

関連する問題