Ember 3+ 将动作从组件传递到控制器不起作用

vis*_*eek 2 components closures controller ember.js

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

下面是我的代码

控制器.hbs

{{generic-err-modal err=receivedErr showDialog= this.showErrorModal onSave=(action "closePromptDialog")}}
Run Code Online (Sandbox Code Playgroud)

控制器.js

@action
closePromptDialog(){
    this.set("showErrorModal",false);
}
Run Code Online (Sandbox Code Playgroud)

组件.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}}
Run Code Online (Sandbox Code Playgroud)

组件.js

@action
hideModal(){
    this.args.onSave();
}
Run Code Online (Sandbox Code Playgroud)

在这我收到错误

Uncaught TypeError: method is not a function
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

我使用的 Ember 版本是 3.18.0

小智 5

从 Octane 版本开始,一切在 Ember One 中变得更加明确,例如{{action}}传递函数的助手。在经典(pre-octane)模型中,当将字符串传递给action像 ,之类的帮助器时{{action "closePromptDialog"}},Ember 将在相应控制器closePromptDialogactions哈希中搜索操作,如指南中的示例中所述。

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

控制器.hbs:

{{generic-err-modal 
  err=receivedErr   
  showDialog=this.showErrorModal 
  onSave=this.closePromptDialog
}}
Run Code Online (Sandbox Code Playgroud)

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