sendAction和send有什么区别?

Dra*_*gan 23 ember.js

我定义了两个自定义对象,第一个是扩展Ember.TextField,第二个是Ember.Select.当在Ember.TextField中触发相应的操作时,我会进行一些处理,如果满足要求,那么我将操作传播到底层控制器@sendAction("actionName").

但是,当我尝试使用Ember.Select做同样的事情时,我得到以下错误:

Uncaught TypeError: Object [object Object] has no method 'sendAction' 
Run Code Online (Sandbox Code Playgroud)

并且必须改为使用@get("controller").send("actionName").我的导师认为这种不一致会导致意大利面条代码,我同意他的意见.为什么我不能打电话@sendAction给Ember.Select,这是我在Ember中理解的首选方式?

两者之间的主要区别是什么?

Kin*_*n2k 18

sendAction应该在组件内部使用.如果在连接组件时定义了该操作,它允许您突破组件的范围.这有助于保持组件保证隔离,但如果您想要监听它,仍然允许组件发送消息.https://guides.emberjs.com/v2.4.0/components/triggering-changes-with-actions/

{{my-component someInternalAction=someExternalAction}}
Run Code Online (Sandbox Code Playgroud)

send 应该在其他地方使用.

Ember.Select并且Ember.TextField都是组件,因此您需要使用sendAction

  • `send`应该在`views`(在2.0中弃用),`controllers`(大多数在2.0中弃用)和`routes`(在2.0中仍然很好和强)中使用.组件中的`sendAction`. (7认同)
  • 我想补充一点,如果你想让一个组件在自身上触发一个动作*,你应该在组件中使用`send`(和*not*sendAction).`sendAction`用于触发"传递给"组件的动作.如果模板需要一些常用功能,并且作为更复杂操作的一部分,您可能希望这样做; 如果模板中不需要功能,只需编写一个函数并调用它就可以跳过`send`. (5认同)