2011-11-26 13 views
5

私は自分自身をバックボーンハッカーと呼んでいます。私はフレームワークが何をすることができるのか、その限界がどこにあるのかを知っています。私はまた、いくつかのテンプレートフレームワークでいくつかの経験を持っています。なぜ誰もがrenderメソッドを使用して親子ビューを構築していますか?

多くのチュートリアルでは、複雑なネストされたビューの作成方法を説明していますが、そのほとんどはテンプレートを使用して部分的に作成してから、親ビューのrenderメソッド内でテンプレート化された子を結合します表示

私にとって、これはなぜ宣言的なコードでレイアウトレンダリングに対処すべきか理解できません。フレックスから来て、私はそれを決してしないように教えられました。私はいつも、レイアウト記述と変数バインディングをマークアップに残し、イベント処理はこのマークアップを使用する宣言(Viewインスタンス)コードに任せました。

私がテストしたテンプレートフレームワークはありませんが、ネストされたビューで複雑なマークアップを作成することはできません。テンプレートから実際にテンプレートを呼び出すことはできず、したがってViewオブジェクトをインスタンス化することはできません。これは技術的に可能ですが、特にデータ属性を使用して、型名を指定することができます。

次に、ルートレベルのViewクラスのすべてのレンダリングメソッドは、このテンプレートをHTMLマークアップに変換し、子オブジェクトのタイプを調べ、そのいずれかの子ビューインスタンスを作成し、それらの子オブジェクトが子オブジェクトを持つべきである場合には、さらにそれを保つ。すべてのビューにモデルコンテキストが与えられます。基本的には、私たちが常に処理する標準的な手順ですが、Backbone.Viewレベルで自動化されています。

誰もがこれについて考えていますか?なぜ誰もこれを使用していないようですか?

+0

[トリビリティはネストされたビューで複雑なマークアップを行う](https://github.com/Raynos/trinity)。また、トリニティビューを簡単に処理して、すべてのネストされたビューのBackbone Viewオブジェクトを作成することもできます。あなたのコンセプトの問題は、強力な継承を可能にするまともなテンプレートシステムが必要なことです。それらはまれです。 – Raynos

+5

私はこれが他の所に所属していると感じていますが、解決できるコードで定義された問題ではなく、親子ビューのベストプラクティスに関するディスカッションです... Q&Aよりも議論の方が多いようですトピック。おそらくコミュニティウィキのための何か? – Sander

+0

私はあなたの特定の問題についてはわかりませんが、JavaのAWTライブラリは、あなたが否定的な表現をしているように振る舞います。レイアウトマネージャは、要素のコントロールリストを配置します。子はコントロール/コンテナツリーを構築するために再帰的にレンダリングされます。 BackboneでHandlebars.jsを使用して再帰的レンダリングビューを構築したので、カスタムテンプレート操作が常に必要と思われるテンプレートをハックしようとするよりも、より洗練されたコードベースのソリューションが好きです。 – Max

答えて

1

レンダリングはまったく使用する必要はなく、主にコードの変更後にレンダリングするために予約されています。 CSSセレクタに基づいてビューを直接バインドすることができます(これについては、ドキュメントを参照してください)。

さらに、データバインディングを大幅に簡素化し、必要とされる「手作業」労力を軽減するモデル結合拡張があります。あなたはそれをチェックしたいかもしれません。

http://github.com/derickbailey/backbone.modelbinding

最後に、私は、親子関係のレンダリングについては、これを言うだろう。 Do not call the DOM in a loop。これは信じられないほど非効率的であり、少なくとも1つの理由で人々は親のレンダリング方法でのみ親子関係を構築するでしょう。それぞれの子供がjQueryを使って自分自身をレンダリングすると、ブラウザーで多くの作業が行われます(現代のブラウザーでこれを気付かない場合は、IE8で試してみてください)。

1

renderメソッドで子ビューをインスタンス化することは意味をなさないことに同意します。私は、多くの場合、追加の引数に渡したいので、子ビューを初期化するとき、私は完全にプロセスを自動化するために躊躇するだろうが、例えば:

var childCollection = someLogicToCreateTheChildCollection(); 

new ChildView({ 
    collection : childCollection 
}); 

だから、私は私が必要とするすべての子ビューを作成している代わりにやって終わるものをinitializeで、次にrenderでテンプレートをレンダリングし、子ビューをDOMの要素に割り当てます。

この方法では、私のレンダー機能はDOMオーダーを宣言するものではありません(多くの例が追加によって表示されます)。テンプレートはDOMオーダーとレンダー機能を設定します。setElement().render()は子ビューです。

関連する問題