事实上,这不是 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
路由,例如