如何将附加组件的状态属性公开给开发人员?

How do I expose state properties from my add on component to the developer?

我目前正在尝试在 Ember 3.8 中创建附加组件,但我对如何向开发人员公开状态属性有些困惑。我的插件中有一个简单的按钮:

//ui-button/component.js

import Component from '@ember/component';
import layout from './template';
import { oneWay } from '@ember/object/computed'

export default Component.extend({
  layout,
  tagName: '',

  type: 'button',
  task: null,

  isRunning: oneWay('task.isRunning'),

  disabled: oneWay('task.isRunning'),

  onClick(){},

  actions: {

    click(){
      event if 'type' = submit)
      event.preventDefault();

      let task = this.task;

      let onClick = this.onClick;

      task ? task.perform() : onClick();
    }
  }

});

//ui-button/template.hbs

<button onclick={{action "click"}} disabled={{disabled}} type={{type}}> 
  {{yield}} {{if disabled "..."}}
</button>

任务和操作只存在于 application controller:

buttonTask: task(function*() {
    yield timeout(2000)
    yield alert("Clicked after 2 seconds")
}),

actions: {
    clicker() {
        alert('clicked')
    }
}

我可以像这样从 ember 项目中调用它:

<UiButton @onClick={{action "clicker"}}>
  Angle Bracket
</UiButton>

<UiButton @task={{task buttonTask}}>
  Angle Bracket with task
</UiButton>

它工作正常,但我希望能够让开发人员访问 disabledisRunning,以便他们可以添加自己的行为。

我试图创建一个产生属性的中间组件:

//ui-button-yield/template.hbs
{{yield (hash
    button=(component "ui-button"
        task=@task)
    isRunning=task.isRunning
    disabled=task.disabled
 )
}}

并这样称呼它:

{{#ui-button-yield as |button|}}
  {{#button.button task=buttonTask}}
    Handlebars Yield {{if button.isRunning "!!!"}}
  {{/button.button}}
{{/ui-button-yield}}

但是尽管按钮有效,但我无法从代码块访问 disabledisRunning 属性。此外,根据 Ember Inspector,这些属性在 ui-button-yield 组件上不可用,只有 ui-button.

你已经非常接近了,但你的消费模板需要设置得有点不同

{{#ui-button-yield as |button isRunning disabled|}}
  {{#button.button task=buttonTask}}
    Handlebars Yield {{if isRunning "!!!"}}
  {{/button.button}}
{{/ui-button-yield}}

您可能还想考虑:

{{#ui-button-yield task=buttonTask as |button isRunning disabled|}}
  {{#button.button}}
    Handlebars Yield {{if isRunning "!!!"}}
  {{/button.button}}
{{/ui-button-yield}}

你的问题是你从 ui-button-yield yield 但你在 ui-button.

中定义了 isRunningdisabled

如果你真的想使用这个包装上下文组件,那么你需要将你的逻辑移到它上面。