我想编写一个Octane / Glimmer样式的组件,其中传递动作是可选的。编写此内容的最佳方法是什么?
例如,我希望组件的这两种用法都有效:
<MyComponent />
<MyComponent @validate={{action this.validate}} />
现在,我的组件类有很多看起来像这样的代码,请在调用之前检查是否传入了动作:
if (this.args.validate) {
this.args.validate()
}
这仅适用于一项操作,但如果我需要连续调用多个可选方法,则不能。还有什么其他选择?
有多个选项可以使此可选操作的代码更整洁-使用吸气剂,使用tryInvoke
,编写帮助程序或编写修饰器。
使用吸气剂是普通的JavaScript,对于其他阅读该代码的人来说,可能最容易理解:
import Component from '@glimmer/component';
import { action } from '@ember/object';
export default class MyComponent extends Component {
get validate() {
return this.args.validate || function() {};
}
@action
someOtherAction() {
this.validate()
}
}
tryInvoke
是Ember API方法,它在调用函数之前检查是否存在函数。缺点是,当其他人正在搜索该功能的代码时,他们的搜索可能找不到它:
tryInvoke
您可以创建自己的tryInvoke(this.args, 'validate');
帮助程序,并在模板中像这样使用它:
optional
最后,您可以编写自己的装饰器,并将其命名为{{action (optional @validate) someArg}}
,然后使用它来标记组件(如果没有提供任何参数的话,组件应使用的默认值。)>
感谢Bendemboski和theroncross提供信息!