2012-02-24 3 views
2

MVCによると、モデルは「純粋な」データ表現です。プレゼンテーションまたは非DRYデータはそこには必要ありません。たとえば、モデルに「comment_count」フィールドがある場合は、「コメント」または「コメント」を印刷するかどうかを知るために、「use_plural」フィールドも含めてはなりません。あなたがモデルにその情報を入れた場合、それは懸念の悪い分離Backbone.jsでのMVCのガイダンスの検索

This post has 0 comments 
This post has 1 comment 
This post has 2 comments 
... 

だ、しかし、代替ビューでその情報を得ることです。たとえば:

var FooView = Backbone.View.extend({ 
    render: function(){ 
    this.data = this.model.toJSON(); 
    this.data.use_plural = this.data.comment_count === 1; 
    // and fifty more lines like the above 
    $(this.el).html(ich['foo_template'](this.data)); 
    } 
}); 

私の質問は、これらの間モデルの一部であるには余りにも視野っぽいのですが、あまりにもモデルっぽいが、ビューの一部であることをデータのためのこのようなニーズがあるように思われます。 MVVMはこれを扱っていますか?私はそれを見ましたが、それはMicrosoftのハイテクスタック特有のようでした。

var AbstractView = Backbone.View.extend({ 
    deriveData: function(){ 
    this.data = this.model.toJSON(); 
    this.data.use_plural = this.data.comment_count === 1; 
    // and fifty more lines like the above 
    } 
}); 

var FooView = AbstractView.extend({ 
    render: function(){ 
    this.deriveData(); 
    $(this.el).html(ich['foo_template'](this.data)); 
    } 
}); 

var BarView = AbstractView.extend({ 
    render: function(){ 
    this.deriveData(); 
    $(this.el).html(ich['bar_template'](this.data)); 
    } 
}); 

がそれだ:

function deriveData(model){ 
    var data = model.toJSON(); 
    data.use_plural = data.comment_count === 1; 
    // and fifty more lines like the above 
    return data; 
} 

var FooView = Backbone.View.extend({ 
    render: function(){ 
    this.data = deriveData(this.model); 
    $(this.el).html(ich['foo_template'](this.data)); 
    } 
}); 

var BarView = Backbone.View.extend({ 
    render: function(){ 
    this.data = deriveData(this.model); 
    $(this.el).html(ich['bar_template'](this.data)); 
    } 
}); 

もう一つのアイデアは、のAbstractViewクラスを持っているので、同じように、それを継承することでした。私は()メソッドのレンダリングの中から関数にそれを入れて、それを呼び出すことを考えていましたそれほど多くはありませんが、私はちょうど私が無知で浮かんでいないことを確認したいと思っていますが、この正確な質問に対処するこの素晴らしい方法論があります。誰もが何らかの勧告や思考を持っているのですか、ここで私が活用できる確立されたパターンがありますか?ありがとう。

+0

また、テンプレートにはこのようなロジックを組み込んだロジックが埋め込まれていることがありますが、ロジックなしのテンプレートを使用することはできません。さまざまな理由で避けたいもののようです。 – greim

答えて

4

これは個人的な意見です(長年の経験に由来していても多くの人が共有していますが)。

MVCパターンはウェブにはうまく適合しません。そして、問題は常にコントローラにあるようです。しばらく周りにいた人の多くはそれを知っていて、それを静かに受け入れます。ほとんどのフレームワークではMVCという用語をとして分類として使用しています。フレームワークが目指すものをパターンの形で説明すると便利ですし、他のほとんどの同等のフレームワークでもこの用語を使用しています。

あなたが本当にビューで、バックボーンでコントローラ誰が誰であるかに意味を添付する必要がある場合は、ほとんどの人は、彼らは両方とも表示されていると思います。ビューはテンプレートを生成しますが、UIからモデルにイベントをディスパッチしたり、逆もあります。実際にそれらを別々にする必要がある場合は、Viewクラスがコントローラであり、テンプレートがビューであると考えることもできます。

うまくいけば、あなたはそれをと呼んでも構いません。どのように使用するかは重要です。

質問の実際的な部分について: 私は文脈によってこれらのいずれかを使用します。それはあなたが一度使う小さなものですか?中に入れてくださいrender。それはあなたのViewアーキテクチャーの一部であり、複数のビューで必要とされるいくつかのロジックですか?基底クラスから派生します。他のすべてと同じように。

+0

不満足な用語について同意します。すべてのフレームワークは、MVCに関しては独自のプライベート言語を持つようです。また、バックボーンはコントローラをルーターに変更しました。それは混乱を回避します。 – greim

関連する問題