如何使用闭包动作调用路径上的动作?

szi*_*mek 20 ember.js

我已经openModal在应用程序路由上定义了操作.我试图在一个组件中调用此操作.

如果我使用语法进行动作冒泡:

{{my-component openModal="openModal"}}

然后一切都按预期工作,我可以使用触发此操作this.sendAction("openModal").

但是,我不确定如何使用新的闭包语法获得相同的结果:

{{my-component openModal=(action "openModal")}}

在这种情况下,Ember抱怨openModal控制器上没有定义任何操作.我是否必须在每个使用的控制器上定义此操作my-component?有没有办法以某种方式使用target选项告诉Ember这个动作是在路线上定义的?可以在单个组件中混合使用冒泡和闭包语法吗?

我正在使用Ember 2.0 beta 1.

And*_*aus 22

在Ember 2.1或2.2或2.3或2.4或2.5或2.6或2.7中某处引入可路由组件之前,不可能从路径传递关闭动作.

目前,您只能将关闭操作从控制器传递到子组件.

UPD: Miko Paderes暗示可以使用插件:https://github.com/dockyard/ember-route-action-helper

  • 我赞成你因为你回答了这个问题,我希望我可以将技术现实用尽.仅对控制器的操作对我来说似乎很疯狂 (3认同)

Ed *_*d . 12

试试这个:

{{my-component openModal=(action send "openModal")}}
Run Code Online (Sandbox Code Playgroud)

...使用控制器上的send方法.

我不能说我完全理解它,因为第二个参数send是,context但它仍然在路线中正确地传递了我的行动的其他参数.我目前正在使用2.4.5版本.

  • 在ember文档中,`context`经常被用来表示'其他参数'.您链接到的页面的摘录"在actionName字符串后提供的任何参数将作为参数传递给操作目标函数." (2认同)

run*_*red 7

您可以通过控制器代理它们来发送关闭操作到路由.这适用于任何支持关闭操作的Ember版本.唯一需要注意的是,动作名称必须与控制器和路线不同.

例如,给定此模板:

{{foo-component myAction=(action 'foo')}}
Run Code Online (Sandbox Code Playgroud)

您需要foo在控制器上执行操作,该操作可以代理路径:

proxyFooTo: 'fooBar',
actions: {

  foo(context) {
    this.send('proxyFooTo', context);
  }

}
Run Code Online (Sandbox Code Playgroud)

然后在路线上

actions: {
  fooBar(context) {  ... handle fooBar ... } 
}
Run Code Online (Sandbox Code Playgroud)