実際、これはEmberの慣用句ではありません。私が知っていること、そしてトム・デール自身から学んだことから、そのコードについてのいくつかの意見があります:
- まず、ルーター内以外の場所からtransitionToを実行しないでください。そうすることで、ルーターがどの状態にあるかわからないため、深刻な問題にさらされることになります。デザイン、そしてところであなたのコードの全体的な品質、そして最後にあなたのアプリの安定性、
- 次に、表示しているアクションコンテンツは、不要なコンテキストの実行を回避するためにルーター内に配置する必要があります。ルーターは確かにアプリ全体に一貫した動作を強制する方法であり、アクションは特定の状態でのみ処理されます。アクションの実装をコントローラーに配置している間、それらのアクションはいつでも呼び出すことができます。
- 最後に、Emberのコントローラーは、主に計算されたプロパティを保持する付加価値のあるラッパーであるため、動作を含めることを目的としていません。それでもプリミティブを因数分解したい場合は、モデルが適切な場所またはサードパーティのコンテキストである可能性がありますが、コントローラーではありません。
必ずルーター内にアクションを配置し、それに応じてtransitionToを実行する必要があります。
これがお役に立てば幸いです。
アップデート
最初の例(サンプルに近い)
適切なルートで:
saveAndReturnSomewhere: function (router, event) {
var store = router.get('store'),
boardName = event.context; // you pass the (data|data container) here. In the view: {{action saveAndReturnSomewhere context="..."}}
store.createRecord(App.Board, {
title: boardName
});
store.commit();
router.transitionTo('somewhere');
}
リファクタリングされた例
次のルートをお勧めします。
show
:既存のアイテムを表示し、
edit
:アイテムのフィールドの入力を提案します
囲んでいるルートに、次のイベントハンドラー:
createItem
:新しいレコードとtransitionToedit
ルートを作成します。例:
editItem
:transitionToedit
ルート
ルートedit
に、次のイベントハンドラー:
saveItem
:storeとtransitionToshow
ルートをコミットします。例: