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');
}
我正在尝试向 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');
}