Ember:将child组件的action发送给parent组件
Ember: Send child component's action to a parent component
我正在尝试从 parent call/trigger child 组件的操作。我已经尝试了几种方法,但我一无所获。到目前为止,这基本上就是我所拥有的。
我试图通过将动作作为参数传递给向下传递的动作来将动作发送到 parent...
这看起来有点像意大利面条,但我的项目组织方式,这就是我的结果。
如果有人可以,请告诉我如何成功地将一个动作作为参数传递给 parent。 (如果可能的话,我很想知道怎么做)
如果有人对如何调用 child 的操作也有更好的建议,请分享。提前致谢!
parent-component.hbs
{{child-component anAction=(action "anAction")}}
<div onclick={{action actionPassedFromChild}}></div>
parent-component.js
actionPassedFromChild: null,
....
actions: {
parentAction(childAction){
this.set('actionPassedFromChild', childAction);
}
}
child-component.hbs
<div onclick={{action "anAction"}}
child-component.js
....
actions: {
anAction(){
this.parentAction(childAction);
}
childAction(){
//Some operation
}
}
在此示例中,如果我停止 'anAction' 内的代码,我确实有 'childAction'。但是当它被传递到 'parentAction' 时,它是未定义的。谁能解释为什么?
你好像有些错别字。例如,parentAction 不会传递给子组件。但是,如果我理解你想要实现什么——这是可行的,但我什至无法想象你为什么需要这个。
你可以玩我的例子here。 Select 在子组件中,按钮在父组件中。当您在 select 中选择某些内容时 - 子组件将两个函数之一发送到父组件。当您单击一个按钮时 - 父组件会调用该函数。
代码:
//child-component.js
import Ember from 'ember';
export default Ember.Component.extend({
line1: "Say Hi!",
line2: "Say Yeah!",
changeAction(newAction) {
switch (newAction) {
case "1":
this.onActionChange(this.action1);
break;
case "2":
this.onActionChange(this.action2);
break;
default:
this.onActionChange(undefined);
break;
}
},
action1: Ember.computed(function(){
const that = this;
return function() {
alert(that.line1);
}
}),
action2: Ember.computed(function(){
const that = this;
return function() {
alert(that.line2);
}
})
});
//child-component.hbs
<select onchange={{action changeAction value="target.value"}}>
<option>Choose something</option>
<option value="1">Action 1</option>
<option value="2">Action 2</option>
</select>
//parent-component.js
import Ember from 'ember';
export default Ember.Component.extend({
childishAction() {
if (typeof this.childAction === 'function') {
this.childAction();
}
}
});
//parent-component.hbs
{{child-component onActionChange=(action (mut childAction))}}
<div><button disabled={{unless childAction true false}} onclick={{action childishAction}}>Let's do it!</button></div>
这里发生了什么——当 ember 呈现模板时,您不能将未定义的内容传递给 action
帮助程序。因此,您需要将子组件发送的操作存储到某个变量中,并使用父组件的一些中间操作来调用它。
在我的示例中,子组件返回的函数存储在父组件的childAction 属性中,父组件childishAction
调用它。
希望这对您有所帮助。但你可能试图以不正确的方式解决一些问题。
我正在尝试从 parent call/trigger child 组件的操作。我已经尝试了几种方法,但我一无所获。到目前为止,这基本上就是我所拥有的。
我试图通过将动作作为参数传递给向下传递的动作来将动作发送到 parent...
这看起来有点像意大利面条,但我的项目组织方式,这就是我的结果。
如果有人可以,请告诉我如何成功地将一个动作作为参数传递给 parent。 (如果可能的话,我很想知道怎么做)
如果有人对如何调用 child 的操作也有更好的建议,请分享。提前致谢!
parent-component.hbs
{{child-component anAction=(action "anAction")}}
<div onclick={{action actionPassedFromChild}}></div>
parent-component.js
actionPassedFromChild: null,
....
actions: {
parentAction(childAction){
this.set('actionPassedFromChild', childAction);
}
}
child-component.hbs
<div onclick={{action "anAction"}}
child-component.js
....
actions: {
anAction(){
this.parentAction(childAction);
}
childAction(){
//Some operation
}
}
在此示例中,如果我停止 'anAction' 内的代码,我确实有 'childAction'。但是当它被传递到 'parentAction' 时,它是未定义的。谁能解释为什么?
你好像有些错别字。例如,parentAction 不会传递给子组件。但是,如果我理解你想要实现什么——这是可行的,但我什至无法想象你为什么需要这个。
你可以玩我的例子here。 Select 在子组件中,按钮在父组件中。当您在 select 中选择某些内容时 - 子组件将两个函数之一发送到父组件。当您单击一个按钮时 - 父组件会调用该函数。
代码:
//child-component.js
import Ember from 'ember';
export default Ember.Component.extend({
line1: "Say Hi!",
line2: "Say Yeah!",
changeAction(newAction) {
switch (newAction) {
case "1":
this.onActionChange(this.action1);
break;
case "2":
this.onActionChange(this.action2);
break;
default:
this.onActionChange(undefined);
break;
}
},
action1: Ember.computed(function(){
const that = this;
return function() {
alert(that.line1);
}
}),
action2: Ember.computed(function(){
const that = this;
return function() {
alert(that.line2);
}
})
});
//child-component.hbs
<select onchange={{action changeAction value="target.value"}}>
<option>Choose something</option>
<option value="1">Action 1</option>
<option value="2">Action 2</option>
</select>
//parent-component.js
import Ember from 'ember';
export default Ember.Component.extend({
childishAction() {
if (typeof this.childAction === 'function') {
this.childAction();
}
}
});
//parent-component.hbs
{{child-component onActionChange=(action (mut childAction))}}
<div><button disabled={{unless childAction true false}} onclick={{action childishAction}}>Let's do it!</button></div>
这里发生了什么——当 ember 呈现模板时,您不能将未定义的内容传递给 action
帮助程序。因此,您需要将子组件发送的操作存储到某个变量中,并使用父组件的一些中间操作来调用它。
在我的示例中,子组件返回的函数存储在父组件的childAction 属性中,父组件childishAction
调用它。
希望这对您有所帮助。但你可能试图以不正确的方式解决一些问题。