2

私は、いくつかの特徴を持つブログでウェブサイトをセットアップしている最中です。これは一種の tumblr 風の体験で、さまざまな投稿タイプがあります。

  • Facebook投稿
  • 見積もり
  • 論文
  • リサーチ

idこれらの投稿には、titlepost_date、 、などの共通の属性post_url_slugがいくつかありますが、一部にはpost_imageまたは などpost_external_linkがあります。これはすべて、、などpost_typeの値を保持できる に依存します。 をレンダリングし、別のテンプレートを完全に選択するか、アンダースコアの任意の JavaScript を使用してテンプレートでこれを処理するときに、どのタイプであるかを判断するための良い戦略は何でしょうか。私のテンプレート?任意の入力をいただければ幸いです。facebookquotearticleMarionette.CollectionView

ありがとう!

4

3 に答える 3

6

ビューテンプレートにロジックを入れないでください。それは、痛み、苦しみ、憎しみ、そして暗黒面につながります。:P

getItemViewCollectionView または CompositeViewのメソッドをオーバーライドし、それを使用して必要なビューの種類を決定できます。https://github.com/marionettejs/backbone.marionette/blob/master/src/marionette.collectionview.js#L122


var Stuff = Marionette.CollectionView.extend({
  // ...,

  getItemView: function(item){
    var type = item.get("whatever_field");
    var viewType;
    if (type === "some value"){
      viewType = SomeViewType;
    } else {
      viewType = AnotherViewType;
    }
    return viewType;
  }
});
于 2013-08-15T13:40:18.800 に答える
1

CollectionView の getItemView をオーバーライドする必要はありません。ItemView は、使用するテンプレートの決定を担当する必要があります。これが getTemplate の目的です。次のようになります。

var MyItemView = Marionette.ItemView.extend({
    getTemplate: function() {
        var template;
        switch(this.model.get('type')) {
            case 'facebook':
                template = 'Template for Facebook type';
                break;
            case 'quote':
                template = 'Template for Quote type';
                break;
            case 'article':
                template = 'Template for Article type';
                break;
        }
        return template;
    }
});

このようにして、持っている 1 つのモデルに対して ItemView を 1 つだけ持つことができ、レンダリングの決定はテンプレートに委ねられます。

于 2013-08-15T13:49:17.430 に答える