EmberJS:如何从控制器转换到路由器's的操作

EmberJS: How to transition to a router from a controller's action

本文关键字:操作 路由器 转换 控制器 EmberJS      更新时间:2023-11-26

我有一个操作:

{{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

如何从控制器操作重定向回路由?

使用transitionToRoute('route')在Ember控制器内部重定向操作:

App.AddBoardController = Ember.Controller.extend({
    create: function(){ 
        ...
        //TODO: Redirect to route
        this.transitionToRoute('route_name');
    }
...

事实上,这不是Ember惯用语。根据我所知道的,以及我从Tom Dale身上学到的,以下是关于该代码的一些评论:

  • 首先,你不应该从路由器内部以外的其他地方转换to:这样做,你会让自己面临严重的问题,因为你不知道路由器处于哪个状态,所以为了保持东西的运行,你很快就会降低你的设计,顺便说一句,你的代码的整体质量,最后是你的应用程序的稳定性
  • 其次,您显示的操作内容应该位于路由器内部,以避免不希望的上下文执行。路由器确实是为整个应用程序强制执行一致行为的一种方式,只在特定状态下处理操作。当您将操作实现放入控制器时,可以随时调用这些操作,包括错误的
  • 最后,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');
}

重构示例

我建议有以下路线:

  • CCD_ 1:显示已有项目
  • edit:建议输入项目的字段

进入封闭路由,使用以下事件处理程序:

  • createItem:创建一个新记录并转换到edit路由,例如
  • editItem:转换到edit路由

进入edit路由,使用以下事件处理程序:

  • saveItem:它将提交存储并转换到show路由,例如
编辑:继续阅读,Mike的回答讨论了这种方法的一些问题。

您可以直接在路由器上调用transitionTo。如果您使用的是默认值,它看起来像show0。