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

Cha*_*lie 13 javascript ember.js ember-old-router

我有一个动作:

{{action create target="controller"}}
Run Code Online (Sandbox Code Playgroud)

我已将其定位到绑定控制器(而不是路由器),如下所示:

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

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

Hao*_* Li 18

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

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


Mik*_*ski 17

事实上,这不是Ember惯用语.据我所知,以及我从Tom Dale自己学到的东西,这里有一些关于该代码的评论:

  • 首先,你不应该从路由器内部转移到其他地方:通过这样做,你会暴露自己的严重问题,因为你不知道路由器在哪个状态,所以为了保持运行,你很快就会降低你的设计,顺便提一下代码的整体质量,最后确定应用的稳定性,
  • 其次,您显示的操作内容应位于路由器内部,以避免意外的上下文执行.路由器确实是一种强制整个应用程序连贯行为的方法,只在某些状态下处理操作.当您将动作实现放入控制器时,可以随时调用这些动作,包括任何错误...
  • 最后,Ember的控制器并不旨在包含行为,因为它们更像是增值包装器,主要包含计算属性.如果你想要对基元进行因子分解,那么模型可能是一个好地方,或者是第三方环境,但肯定不是控制器.

你绝对应该把动作放在路由器里面,并相应地转换.

希望这会有所帮助.

UPDATE

第一个例子(靠近你的样本)

在适当的路线:

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');
}
Run Code Online (Sandbox Code Playgroud)

重构的例子

我建议你有以下路线:

  • show:显示现有项目,
  • edit:建议输入项目的字段

进入封闭路径,跟随事件处理程序:

  • createItem:创建新记录并转换到edit路线,例如
  • editItem:transitionTo editroute

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

  • saveItem:将提交存储和转换到show路由,例如

  • 所以......这似乎不对.你是从路由器的商店提交的吗?这看起来肯定是控制器应该做的事情,路由器应该只处理路由并可能将数据绑定到控制器.否则,它就有可能成为所有UI逻辑的大规模切换/案例声明. (5认同)
  • @JanDupal事实上,正如你所看到的,这个问题被标记为`ember-old-router`而不再适用于当前的路由器 (2认同)