在Ember中,您可以使用this.actions.actionName()
在正常功能中调用当前上下文中的操作。这意味着该操作可以返回一个值。
在我的登录路线中,我试图以这种方式从应用程序路径调用一个动作。但是this.actions
仅包含我的登录路由中的操作。
登录路线
actions: {
test: function() {
console.log(this.actions.sameRouteAction()); //5
console.log(this.actions.applicationRouteAction()); // this.actions.applicationRouteAction() is not a function.
},
sameRouteAction: function() {
return 5;
}
}
申请路线
actions: {
applicationRouteAction: function() {
return 7;
}
}
this.actions.applicationRouteAction()
必须成为什么才能使其发挥作用?
答案 0 :(得分:2)
从Ember 3.1.0开始,没有办法可以直接在父路由上调用动作作为普通函数,就像在当前路由/类的上下文中一样。您可以使用send
功能向上发送操作:
actions: {
test: function() {
this.send('applicationRouteAction');
},
}
但是你不能以这种方式获得applicationRouteAction
函数的返回值。
将行动结果从父路线传递到子路线的两个最佳选项是:
通过transitionTo或refresh更新父路线的模型。这将更新路径树,您的子路径可以通过modelFor获取其父路径的模型。由于您在示例中使用的是Application路由,这似乎可能不是您想要使用的方法。
创建或使用现有的Service在路由之间进行通信。您可以在两个位置注入服务,从Application路由更新其状态,并从子路径读取其状态。
如果您可以添加有关您希望操作的更多详细信息,我可以更新此答案,并提供有关哪种模式更有意义以及原因的详细信息!