如何从外部打开和关闭 Ember 电源 Select

How to open and close Ember Power Select from outside

我知道 ,但不完整。我想从外部打开和 关闭 下拉菜单。

我可以在单击我的包装器组件时调度一个 mousedown 事件,因此 ember-power-select 触发器打开!。但是如果我再次点击它不会关闭。更准确地说,它会快速关闭并再次打开。

我的假设是组件正在侦听 blur 事件以关闭,然后 mousedown 再次到达并打开触发器。

有没有人设法让它工作?或替代品??我迷路了:)

感谢您的帮助!

wrapper-component.js 

  didInsertElement() {

    this._super(...arguments);
    this.element.addEventListener('mousedown', (event) => {
      event.stopPropagation();
      const eventedElement = this.element.querySelector('.ember-power-select-trigger');
      const mouseDownEvent = new MouseEvent('mousedown');
      eventedElement.dispatchEvent(mouseDownEvent);
    });

  },

根据文档,与 trigger/component 交互的唯一方法是通过 ember-power 的子组件、块和操作中提供的只读 API -select 组件。

由于您已经可以打开触发器,因此您可以将 API 缓存在组件(或路由控制器)中定义的 onchange 事件操作中,并在其中呈现 ember -功率-select:

渲染组件的地方只需向 onopen:

提供一个动作
{{#ember-power-select
  options=options
  selected=selectedOption
  onchange=(action "someAction")
  onopen=(action "cacheAPI")
  as |option|}}
  {{option}}
{{/ember-power-select}}

在呈现它的组件或控制器中:

actions: {

  cacheAPI(options) {
    if (this.powerSelectAPI) return;

    this.set('powerSelectAPI', options);

    // if you just want the actions:
    // this.set('powerSelectAPI', options.actions);
  }

}

然后就可以open/close通过API触发:

this.get('powerSelectAPI').actions.close();

RegisterAPI 是解决方案。 来自文档:

The function that will be called when the component is instantiated and also when any state changes inside the component, and receives a publicAPI object that the user can use to control the select from the outside using the actions in it.

@action
registerAPI(emberPowerSelect) {
  if (!this.emberPowerSelect) {
    this.emberPowerSelect = emberPowerSelect;
  }
}
    
@action
toggle(state) {
  if (state) {
    this.emberPowerSelect.actions.open();
  } else {
    this.emberPowerSelect.actions.close();
  }
}