この投稿はかなり古いものですが、今日は以前にレビューしていたので、他の誰かがそれに出くわした場合に備えて:
私には、2つの別々の質問があります。
- データ取得の仕組みとその結果のビューのレンダリングは、ルーターまたはビューのどこで行われるべきですか?
- ビューは既に解決済みのモデルを期待するべきですか、それともまだロード中の可能性があるモデルに応答するべきですか?
私たちがそれを処理する方法の一部と、いくつかの個人的な好みが混在しています。
- どちらでもありませんが、私はルーターに寄りかかります。ルーターはルーティングを処理し、ビューは表示を処理する必要があり、別の何かがモデル/コレクション フェッチ ロジックのメカニズムとワークフローを処理する必要があります。これは、ルーターが基本的に委譲するコントローラーと呼ばれるものです。
- ユリがほのめかすように、「時々」は現実です。これはおそらくケースバイケースの決定だと思いますが、最終的には、ルーター/ビュー間ではなく、コントローラーとビュー間の契約になるはずです。
私はユリの箇条書きが好きですが、いくつかの注意点があります (インデントされた箇条書き):
- ルーターは、ユーザーの送信先のみを知っています
- 外側のビューは、ユーザーが何を表示する必要があるかのみを認識します (そのデータが与えられた場合)
- 外側のビューが内側のビューのユース ケースに固有であり、別のビューによって「所有」されていると仮定します (クリーンアップのため)。
- それ以外の一般的なコンテナー (「メイン」の場所へのレンダリングなど) の場合、ページ上の特定の「セクション」のビューを管理するコンポーネントがあると便利であることがわかりました。これをレンダラーと呼びます。
- 内部ビューは、すべての小さな部分のみを表示する方法しか知りません (そして、他の場所で使用できます)。
- レンダー関数は常に現時点で正しいものを表示します。
- 汎用コンテナの場合、最終的にはレンダラーの責任になります
Renderer の主な理由は、ゴースト ビューを回避するために既存のビューをクリーンアップする、レンダリング時に一番上までスクロールする (MainContentRenderer がそれを行います)、この場合はスピナーを表示するなど、そのセクションに関連することを処理することです。
それがどのように見えるかの疑似コードっぽい例:
- 一般的なコンテンツターゲット「メイン」(ユースケース固有の場合は、ビューのライフサイクル管理戦略に応じて、Yuri の例のように ComponentView を使用する方がよい場合があります)
- 取得して待機する必要があるモデル
- すでにロードされたモデルを受け入れるビュー
ルーター:
routes: {
"profile": "showProfile"
},
showProfile: function() {
return new ProfileController().showProfile();
}
プロファイルコントローラー:
showProfile: function() {
//simple case
var model = new Model();
var deferredView = model.fetch.then(function() {
return new View(model);
};
MainContentRenderer.renderDeferred(deferredView);
}
MainContentRenderer:
var currentView;
renderDeferred: function(deferredView) {
showSpinner();
deferredView.then(function(view) {
this.closeSpinner();
this.closeCurrentView();
this.render(view);
}
},
render: function(view) {
currentView = view;
$('#main-content').html(view.render().el);
}
closeCurrentView: function() {
if (currentView and currentView.close()) {
currentView.close();
}
}
コントローラーの導入には、テスト容易性の追加の利点もあります。たとえば、URL 管理に関する検索の実行、結果ビューと新しい検索ビューの選択、キャッシュされた「最後の」検索結果と新しい検索の実行の選択には、複雑なルールがあります。すべてのフロー ロジックが正しいことを確認するために、コントローラー用の Jasmine テストがあります。また、これらのルールを管理するための独立した場所も提供します。