13

私には行動があります:

{{action create target="controller"}}

これは、次のように(ルーターではなく)バインドされたコントローラーを対象としています。

App.AddBoardController = Ember.Controller.extend
    create: ->
        App.store.createRecord App.Board, {title: @get "boardName"}
        App.store.commit()
        //TODO: Redirect to route

コントローラアクションからルートにリダイレクトするにはどうすればよいですか?

4

3 に答える 3

19

transitionToRoute('route')を使用して、Emberコントローラーアクション内でリダイレクトします。

App.AddBoardController = Ember.Controller.extend({
    create: function(){ 
        ...
        //TODO: Redirect to route
        this.transitionToRoute('route_name');
    }
...
于 2013-07-25T02:05:49.527 に答える
17

実際、これは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ルートをコミットします。例:
于 2012-07-19T06:22:08.460 に答える
3

編集:読み続けてください、マイクの答えはこのアプローチの問題のいくつかを議論しています。

ルーターでtransitionToを直接呼び出すことができます。デフォルトを使用している場合、これはのようになりApp.router.transitionTo('route', context)ます。

于 2012-07-19T01:19:39.563 に答える