私の経験では、UI モデルは非常に役に立ちました。ContextModel
アプリのすべての「ページ」を維持します。本当に素晴らしいのは、「ページ」が完全に初期化されることが保証されているContextModel
ため、コンテキストが最初に作成された場所は1つだけです。
AppView
特定のルートがトリガーされたときに、ページの初期コンテキストの作成を常に処理します。ルート ハンドラーは、コンテキストのデフォルトが設定される場所であり、物事はルートの値から解析されます。
ページ自体が初期化されると、 への変更について心配するだけでContextModel
済み、必要な更新を行ってからパスを更新するハンドラーを用意するだけで済みます。
これは、私たちの から直接引っ張ってきた例AppView
です:
onSomeRoute : function (project, category, pivot, tab, item) {
// Setup page context with defaults.
var options = {
category : 'traits',
tab : 'population',
item : null
};
// Figure out what the allowed categories and tabs are from this
// environment by checking against all schema items.
[snipped]
// Resolve the `category` and the `pivot`. Try and match the pivot's
// slug, else choose the first pivot in the category.
if (_(categories).contains(category)) options.category = category;
[snipped]
if (pivots) options.pivot = pivots.find({ slug : pivot }) || pivots.first();
// Resolve the `tab` and `item`. Only allow valid tabs, and then try
// to match the item's slug as well, or choose the first one.
var tabs = ['population', 'sources', 'engagement', 'retention'];
if (_(tabs).contains(tab)) options.tab = tab;
[snipped]
// Now that we've applied some defaults, make sure the path is
// updated to reflect what the interface is showing.
[snipped]
this.loadPage('some-page', options);
}
次に、PageView
問題の変更ハンドラがいくつかあります。
// When category changes, try to match the current pivot against pivots
// in the category, else choose the first pivot from the category.
onCategoryChange : function (context, category) {
var schema = this.context.get('environment').get(category);
if (!schema.contains(this.context.get('pivot')))
this.context.set('pivot', schema.first());
this.router.update({
category : category
});
},
// When the pivot changes, create a new set of segments for the context.
onPivotChange : function (context, pivot) {
Segmenter.segment(context, function (segments) {
context.get('segments').reset(segments).each(function (segment) {
segment.evaluate();
});
});
this.router.update({
pivot : pivot.get('slug')
});
},
すべての変更ハンドラーが、コンテキストの変更に基づいてページの URL を更新し続けることに注意してください。(これを非常に簡単にするために、ルーターにいくつかのカスタム メソッドを作成しました。) しかし、それらは、ページで発生する必要がある他のロジックも実行します。
うまくいけば、そのいくつかがあなたにアイデアを与えるのに役立ちます. 一般に、URL に保存されている状態はすべて私たちPageContext
のものであり、その状態から派生した他のいくつかのものも便宜上そこに保存されます。