Ember _ 如何从组件控制器访问控制器操作

Ember _ How to access to a controller action from a component controller

我正在尝试向 ember 组件添加一些外部功能。该组件是以下组件:

应用程序/模板/programmers.hbs

{{echo-hlabel-tf 
   id= "id-test-hlabel"
   class="class-test-hlabel-mio"
   label="Horizontal textfield"
   textValue="..."
   regExp="^([a-z0-9]{5})$"
   errorMsg="Text hasn't five characters"
   fnActionButtonClicked = "sayHello"
}}

我在玩参数 'fnActionButtonClicked' 。这个参数代表它执行的一个函数,它不在组件的功能中(比如传递一个 javascript 函数作为参数)。我是新手,我不知道 ember 的确切方法。组件的模板是:

app/templates/components/echo-hlabel-tf.hbs

<div id="echo-hlabel-tf">
    <span id="{{id}}-echo-hlabel-tf-label" 
          class="{{class}}-echo-hlabel-tf-hlabel">
    {{label}}
</span>
<span id="{{id}}-echo-hlabel-tf-value" 
      class="{{class}}-echo-hlabel-tf-value">
    {{input id='input-id' class='input-class' value=textValue
            focus-out = (action 'validateRegExp' textValue regExp) 
    }}
</span>
<span id="{{id}}-echo-hlabel-tf-error-msg" 
 class="{{class}}-echo-hlabel-tf-error-msg">
    <p id='error-msg' class="error-msg">
        {{errorMsg}}
    </p>
</span>

<div>
    <h2>Testing passing functions to the component</h2>
        <input type="button" {{action "actionButtonClicked"}}/>
</div>
</div>

如您所见,在模板底部,有一个输入 type="button" 与 "actionButtonClicked" 绑定。组件的控制器是:

app/components/echo-hlabel-tf.js

import Ember from 'ember';

export default Ember.Component.extend({
   classNameBindings:['error'],
   error:false,

   actions: {
    validateRegExp(text,regExpStr,event){
        let regExpObj = new RegExp(regExpStr)
        if(regExpObj.test(text)){
            this.set('error',false);
        }else{
            this.set('error',true);
        }
    },
    actionButtonClicked(){
        console.log('Arrives to the component');
        var action = this.get('fnActionButtonClicked');
        console.log(action);
        // How can I call the function in another controller
        // With parameter fnActionButtonClicked name
    }
 }
});

所以,模板的参数'fnActionButtonClicked'(SayHello)会在actionButtonClicked()中通过var 动作 = this.get('fnActionButtonClicked'); .

所以,这个时候,疑惑来了。由于我无法将 javascript 函数作为模板的参数传递(或者至少,我认为这不是正确的做事方式),我创建了一个控制器 'sampleController' 使用以下代码创建操作 'sayHello'(请参阅参数 fnActionButtonClicked 值):

应用程序/控制器/样本-controller.js

从 'ember' 导入 Ember;

export default Ember.Controller.extend({
   actions:{
    sayHello(){
        console.log("I'm saying hello this time");
    }
  }

});

我怎样才能从 app/components/echo-hlabel-tf.js:actionButtonClicked() 执行 app/controllers/ 的代码示例-controller.js : sayHello() ?如何从组件控制器访问另一个控制器?这是 ember 实现我目标的正确方法吗?

提前致谢

代替 sample-controller.js ,您需要为特定路由 programmers 创建控制器。所以创建 app / controllers / programmers.js 文件,

export default Ember.Controller.extend({
  actions:{
    sayHello(){
      console.log("I'm saying hello this time");
    }
  }
})

和组件内部 app / components / echo-hlabel-tf.js.

actionButtonClicked(){
  console.log('Arrives to the component');
  this.sendAction('fnActionButtonClicked');        
}