假设我有一条带有类似事件的路线
App.FooRoute = Ember.Route.extend({
events: {
anAction: function(){
}
}
})
如何从另一个路由/控制器的角度触发它?
<a {{action anAction target='???'}}> a link </a>
假设我有一条带有类似事件的路线
App.FooRoute = Ember.Route.extend({
events: {
anAction: function(){
}
}
})
如何从另一个路由/控制器的角度触发它?
<a {{action anAction target='???'}}> a link </a>
假设您有这样的路线:
App.Router
|
+ FooRoute
|
+ BarRoute
FooRoute
将动作从 发送到意味着什么BarRoute
?用户已前往/foo
,因此FooModel
、FooController
和FooView
已初始化,但尚未初始化Bar*
。行动会做什么?
在这种情况下,有一个BarModel
around 是FooRoute
. 解决这个问题的最类似于 Ember 的方法是使用嵌套路由:
App.Router.map(function() {
this.resource('bar', function() {
this.route('foo');
}
});
用户去/bars/123/foo
并点击链接,触发anAction
. Ember 会自动将该动作冒泡到路由层次结构中,因此您可以简单地定义anAction
on BarRoute
。
在这种情况下,BarModel
不需要 a。anAction
做一些不是真正Foo
相关的事情,但也不是Bar
相关的。我们可以使用相同的冒泡技巧,但不是定义anAction
on BarRoute
,而是在主路由器上定义它。
假设该操作需要“当前用户”。这种情况很像#2,因为您不需要嵌套路由。但是,它确实需要您拥有一个可全局寻址的控制器,例如App.currentUserController
. 您可以直接将其指定target
为{{action}}
.
如果上述选项似乎都不正确,您可以使用controllerFor
在 上设置barController
属性fooController
:
App.FooRoute = Ember.Route.extend({
setupController: function(controller) {
var barController = this.controllerFor('bar');
controller.set('barController', barController);
}
});
然后你可以做{{action anAction target=barController}}
。
Ember 将自动尝试对控制器执行该操作,然后冒泡路由层次结构。如果模型依赖于其他模型,您可能需要嵌套路由或全局控制器来确保连接您的先决条件。
正如Ember Docs中所解释的,您可以使用名为 Ember.ViewTargetActionSupport 的内置 mixin 将操作发送到应用程序中的不同控制器或视图或路由。
处理您的问题的简单方法如下:
当前模板:
<a {{action 'actionInView' target='view'}}>Click me</a>
风景:
App.CurrentView = Em.View.extend(Em.ViewTargetActionSupport, { // Note the mixin
actions: { // Actions hash
actionInView: {
this.triggerAction({ // Without a target this will bubble through the routes
action: 'theActionToCall', // Name of the action you *actually* want to call
target: App.TargetController, // Or whatever the name of your target is
});
},
},
});
目标控制器:
App.TargetController = Em.ObjectController.extend({
actions: {
theActionToCall: {
// This is where you do the action stuff that you *actually* are trying to do
},
},
});
本质上,名为 actionInView 的操作除了调用您真正想要但无法访问的操作之外什么都不做,因为它位于应用程序的不同部分。如果您没有指定目标,那么您可以将操作放在父路由或应用程序路由上,它将被调用。