EmberJS:如何从控制器的动作转换到路由器 [英] EmberJS: How to transition to a router from a controller's action

查看:129
本文介绍了EmberJS:如何从控制器的动作转换到路由器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个动作:

{{action create target="controller"}}

我已经针对绑定的控制器(而不是路由器)这样:

which I have targeted to the bound controller (rather than the router) like this:

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

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

How do I redirect back to a route from the controller action?

推荐答案

其实这不是Ember惯用的。从我所知道的以及我从汤姆·戴尔自己身上学到的东西,这里有一些关于该代码的评论:

In fact, this is not Ember idiomatic. From what I know, and what I have learnt from Tom Dale himself, here are some remarks about that code:


  • 首先,你不应该从别的地方转移到路由器内部:通过这样做,你会暴露自己的严重问题,因为你不知道在哪个状态是路由器,所以要保持东西运行,你将很快降级你的设计,并通过方式您的代码的整体质量,最后是您的应用程序的稳定性,

  • 其次,您显示的操作内容应位于路由器内部,以避免不必要的上下文执行。路由器确实是为整个应用程序强制执行连贯行为的一种方式,只在某些状态下处理该动作。当您将操作实施到控制器中时,可以随时调用这些操作,任何包含错误的操作。

  • 最后,Ember的控制器并不旨在包含行为,因为它们是值加载包装,主要计算属性。如果你想要将原始因素分解,也许模型可以是一个好的地方,或第三方的上下文,但肯定不是控制器。

你应该把路由器里面的动作放在路由器里面,然后转换到。

You should definitely put the action inside the router, and transitionTo accordingly.

希望这将有所帮助。

更新

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

在专用路由中:

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 :显示现有项目

  • 编辑:建议输入项目的字段

  • show: displays an existing item,
  • edit: proposes to input item's fields

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

Into the enclosing route, following event handlers:


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

  • editItem :transitionTo 编辑路线

  • createItem: create a new record and transitionTo edit route, e.g
  • editItem: transitionTo edit route

进入编辑路由,以下事件处理程序:

Into the edit route, following event handlers:


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

  • saveItem: which will commit store and transitionTo show route, e.g

这篇关于EmberJS:如何从控制器的动作转换到路由器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆