在组件中使用 this.sendAction()?

Using this.sendAction() in components?

我正在使用 Ember 2.2.0

在编写组件时,我曾经使用 this.sendAction(…) 将事件从组件传播到路由(或嵌入组件的任何内容)。我最近查看了文档,发现他们建议另一种方法。 https://guides.emberjs.com/v2.2.0/components/triggering-changes-with-actions/

this.get('action')();

因为众所周知 Ember 非常固执己见,所以我想尽可能多地坚持最佳实践。但我不确定文档是否已过时或使用 sendActions 的教程是否已过时。

请问有什么方法可以做到这一点?

当你使用 this.sendAction('actionName') 时,你正在冒泡一个动作,你必须用 actions

赶上 component/controller
//controller/route/component.js
actions: {
  actionName: function() {
    //Do something
  }
}

如果你想把它发送到链上,你必须在 component/controller 上再次调用 sendAction('') 并在父级上再次捕获它(依此类推)。

另一种方法 this.get('action')() 使用闭包操作,它们是常规的 javascript 函数。据我所知,这些是在 Ember 1.13.X 中调用操作的首选方式。闭包动作的一个优点是你可以有 return 个值。这意味着你可以拥有这样的东西:

//a controller
actions: {
  saveResult() {
    return this.get('model').save(); //notice the return (which returns a promise)
  }
}

//some template that uses the controller above
{{a-component save=(action 'saveResult')}} // Passes the saveResult action to the component

//a-component.js
actions: {
  someAction: function() {
     this.attrs.save().then(() => {
       //Do something with the return value
     });
  }
}

关于闭包操作可以写很多,但其他人写得比我好得多,所以我推荐以下文章:

如果您是整个 DDAU(数据向下操作向上)概念的新手,我真的建议 Sam's article 总体上了解这个概念。

更新:还有一个允许 closure actions to bubble to routes 的插件(链接在@locks 的评论中)。请注意,如果您希望将 Ember 升级到更新的版本(3.8 及更高版本),route-actions 将不兼容。

对于使用 Ember 版本 >=3.4 的用户:

Use closure actions instead of sendAction

sendAction 已在 3.4 中 弃用。您可以在相关弃用文本下找到如何定义关闭操作的示例:

https://deprecations.emberjs.com/v3.x/#toc_ember-component-send-action