EmberJS:如何从控制器的动作转换到路由器

时间:2012-07-19 00:38:35

标签: javascript ember.js ember-old-router

我有一个动作:

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

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

3 个答案:

答案 0 :(得分: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:创建新记录并转换到edit路由,例如
  • editItem:transitionTo edit route

进入edit路由,跟随事件处理程序:

  • saveItem:将提交store和transitionTo show路由,例如

答案 1 :(得分:17)

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

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

答案 2 :(得分:3)

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

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