【问题标题】:Ember 3+ passing action from component to controller not workingEmber 3+ 将动作从组件传递到控制器不起作用
【发布时间】:2020-06-23 07:16:20
【问题描述】:

我们最近从 ember 2+ 转移到了 Ember 3.18.0,我正在努力从组件中调用控制器函数。在以前的版本中,我们使用 sendAction 来冒泡动作,但现在由于 sendAction 已被贬值并且正在使用闭包,我无法正确实现它。

下面是我的代码

Controller.hbs

{{generic-err-modal err=receivedErr showDialog= this.showErrorModal onSave=(action "closePromptDialog")}}

Controller.js

@action
closePromptDialog(){
    this.set("showErrorModal",false);
}

组件.hbs

    {{#if @showDialog}}
  <PaperDialog id="genericModal" class="flex-50" @fullscreen={{fullscreen}} @onClose={{action "closePromptDialog"}} @origin={{dialogOrigin}}>
      <PaperDialogContent class="text-align-center">
          {{paper-icon "remove_circle_outline" class="red" size=48}}
      </PaperDialogContent>
      <PaperDialogContent>
        <h2>{{@err.errorMessage}}</h2>
      </PaperDialogContent>

      <PaperDialogActions @class="layout-row">
        <span class="flex"></span>
        <PaperButton @primary={{true}} @onClick={{action "hideModal"}} @raised={{true}}>Ok</PaperButton>
      </PaperDialogActions>

  </PaperDialog>
{{/if}}

组件.js

@action
hideModal(){
    this.args.onSave();
}

在这个问题上我得到了错误

Uncaught TypeError: method is not a function

任何帮助将不胜感激。

我使用的 Ember 版本是 3.18.0

【问题讨论】:

    标签: ember.js controller components closures


    【解决方案1】:

    从 Octane 版本开始,Ember 中的一切都变得更加明确? 其中之一就是传递函数的 {{action}} 助手。在经典(前辛烷值)模型中,当将字符串传递给 action 帮助器(如 {{action "closePromptDialog"}})时,Ember 将在 @987654321 中提到的相应控制器的 actions 哈希内搜索操作 closePromptDialog @

    由于引入了原生类和@action 装饰器,我们不必使用{{action}} 帮助器以及actions 哈希。如guides of 3.18 中所述,我们可以直接将方法传递给组件而无需操作助手。所以,

    Controller.hbs:

    {{generic-err-modal 
      err=receivedErr   
      showDialog=this.showErrorModal 
      onSave=this.closePromptDialog
    }}
    

    在这里,this.closePromptDialog 将直接引用支持类中的方法,类似于任何其他类属性,例如 receivedErr,在您的情况下。正确的 this 绑定将由 @action 装饰器处理。这同样适用于您在 Component.hbs 文件中的操作。

    【讨论】:

    • 很高兴它有帮助:)
    • 如何从嵌套组件的内部访问closePromptDialog 向下几层?我应该继续将它作为 arg 传递给每个子组件吗?
    • 是的。你是对的,你必须通过组件树将它显式传递给内部组件
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多