迁移到Ember.Router而不破坏现有的基于视图的{{action}}处理程序

时间:2012-08-30 18:41:09

标签: ember.js

我有一个针对1.0之前的emberjs编写的代码库,没有使用Ember.Router或Ember.StateManager。我试图尽可能迭代地迁移到Ember.Router。

我创建了一个骨架App.ApplicationController,App.ApplicationView和App.Router(只有一个路由)。 App.ApplicationView简单地包装了我现有的入口点视图:App.PreRouterMainView。除了 {{action}}对现有视图的绑定不再有效之外,所有内容都已正常加载

我经常使用{{action "someTargetMethod"}}来调用PreRouterChildView.someTargetMethod(),但是在嵌入/'routifying'PreRouterMainView之后,现在在路由器上调用了someTargetMethod()。

是否有一种简单的方法让PreRouterMainView和子视图继续以“旧方式”工作,事件在最近的View而不是路由器上调用方法?

或者我是否需要在一次重大更改中将所有视图方法重构为路由器方法?如果可能的话,我真的很愿意这样做。

1 个答案:

答案 0 :(得分:4)

您必须重构您的操作以明确定位视图(或有效路径上的任何其他对象):

{{action someTargetMethod target="view"}}

但是,操作的默认上下文已更改为路由器,因为路由器应处理大多数操作,尤其是更改状态/路由的操作。您可以在控制器上调用方法并在处理操作的路由器方法中查看(通过事件上下文)。如果操作没有改变状态或数据,那么拥有视图句柄就可以了。

编辑:内联代码文档表明您可以通过在控制器上设置属性来更改默认操作目标:

### Specifying a Target
There are several possible target objects for `{{action}}` helpers:

In a typical `Ember.Router`-backed Application where views are managed
through use of the `{{outlet}}` helper, actions will be forwarded to the
current state of the Applications's Router. See Ember.Router 'Responding
to User-initiated Events' for more information.

If you manaully set the `target` property on the controller of a template's
`Ember.View` instance, the specifed `controller.target` will become the target
for any actions. Likely custom values for a controller's `target` are the
controller itself or a StateManager other than the Application's Router.

If the templates's view lacks a controller property the view itself is the target.