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 惯用的。根据我所知道的以及我从 Tom Dale 本人那里学到的东西,这里有一些关于该代码的评论:

  • 首先,您不应该从路由器内部以外的其他地方转换到:这样做会使您面临严重的问题,因为您不知道路由器处于哪个状态,因此要保持运行,您将很快不得不降级您的设计,顺便说一下代码的整体质量,最后是应用程序的稳定性,
  • 其次,您要显示的操作内容应位于路由器内部,以避免不必要的上下文执行。路由器确实是一种为整个应用程序强制执行连贯行为的方法,仅在某些状态下处理操作。当您将动作实现放入控制器时,可以随时调用这些动作,包括错误的......
  • 最后,Ember 的控制器并非旨在包含行为,因为它们是增值包装器,主要包含计算属性。如果您仍然想分解原语,那么模型可能是一个好地方,或者第三方上下文,但肯定不是控制器。

您绝对应该将动作放在路由器内部,并相应地转换到。

希望这会有所帮助。

更新

第一个示例(接近您的示例)

在适当的路线中:

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: 过渡到edit路由

进入edit路线,以下事件处理程序:

  • saveItem: 这将提交 store 和 transitionToshow路由,例如
于 2012-07-19T06:22:08.460 回答
3

编辑:继续阅读,迈克的回答讨论了这种方法的一些问题。

您可以直接在路由器上调用 transitionTo 。如果您使用默认值,这看起来像App.router.transitionTo('route', context).

于 2012-07-19T01:19:39.563 回答