我如何对组件进行可选操作?

问题描述 投票:0回答:1

我想编写一个Octane / Glimmer样式的组件,其中传递动作是可选的。编写此内容的最佳方法是什么?

例如,我希望组件的这两种用法都有效:

<MyComponent />
<MyComponent @validate={{action this.validate}} />

现在,我的组件类有很多看起来像这样的代码,请在调用之前检查是否传入了动作:

if (this.args.validate) {
  this.args.validate()
}

这仅适用于一项操作,但如果我需要连续调用多个可选方法,则不能。还有什么其他选择?

ember.js ember-3 ember-octane
1个回答
0
投票

有多个选项可以使此可选操作的代码更整洁-使用吸气剂,使用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提供信息!

© www.soinside.com 2019 - 2024. All rights reserved.