Angular 如何从EventEmitter函数返回值?

Angular 如何从EventEmitter函数返回值?,angular,Angular,我在我的核心组件中得到了这个函数: isValid(值:任意){ //做一些事情并根据结果返回一些东西 返回false; } 我将其传递给其他组件,如下所示: <other-component (onBeforeAdding)="isValid($event)"></other-component> 这里的问题是,EventEmitter函数无法返回值,因为它是异步的(尽管从rc2来看,通过将true传递给新EventEmitter函数,这似乎是可选的,但即使这样做也

我在我的
核心
组件中得到了这个函数:

isValid(值:任意){
//做一些事情并根据结果返回一些东西
返回false;
}
我将其传递给
其他组件
,如下所示:

<other-component (onBeforeAdding)="isValid($event)"></other-component>
这里的问题是,
EventEmitter
函数无法返回值,因为它是异步的(尽管从rc2来看,通过将true传递给
新EventEmitter
函数,这似乎是可选的,但即使这样做也无法解决此问题)。因此无论函数返回什么,
isValid
都将始终为真


如何从
EventEmitter
函数返回值?

您需要订阅事件发射器才能获得值:

this.onBeforeAdding.emit(值| | true);
this.onBeforeAdding.subscribe(isValid=>{
如果(有效){
//做事
}
});

简而言之,你不能用
@Output
来实现这一点,但你可以用
@Input
来实现这一点

核心
组件中的相同功能:

isValid(值:任意):布尔值{
//做一些事情并根据结果返回一些东西
返回false;
}
将函数定义作为
@输入传递到
其他组件


其他组件中

@Input()onBeforeAddingProcessor:(值:any)=>布尔值;
恩戈尼尼特(){
//不会在构造函数中定义onBeforeAddingProcessor
设isValid=this.onBeforeAddingProcessor(值);
如果(有效){
//做事
}
}
方法访问
this
如果您必须在提供的函数中访问
this
,则有必要传递一个已经绑定了this上下文的方法:

isValid=(值:any)=>{
返回this.myService.checkValue(value);
}
否则,Angular使用组件的
this
调用方法,而不是组件的使用者。
关于性能的小提示(尽管未测试):如果此方法较大且组件的实例计数较高,则应将代码的较大部分分解为私有成员函数,并从分解的位置调用此函数。原因:上面没有在类的原型上创建函数,而是为组件的每个实例打印出该函数的副本。这会消耗大量内存,很容易避免。

这是不需要太多努力就可以做到的

  • 在子组件中创建EventEmitter

    @输出('request\u data') requestData:EventEmitter=新的EventEmitter()

  • 创建一个方法来请求子组件中的数据,这里的技巧是使用匿名函数传递对象

    单击(){ 此文件为.requestData.emit({ 数据:“一些数据”, func:(来自父项的数据=>{ //你想干什么就干什么 }) }); }

  • 从父组件中,执行任意操作并调用函数

    callFromChild(obj){ //对象数据 //obj.func(); }


  • 不确定我们应该期望什么。在subscribe方法运行之前,我必须运行调用onBeforeAdding两次的函数。知道为什么吗?是的,我同意这只适用于组件输出。这里似乎是这样;-)另外,如何从isValid函数返回值?因为isValid现在变成了值,而不是我从isValid返回的值,它应该是false。这就是我的想法。我认为这个答案对你的情况没有帮助。就像我说的,这是单行道。当堆栈溢出答案的前几句对我有效时,它没有提供您想要的功能,当出现不相关的问题时,相同的答案甚至可以预测并回答该问题;感谢@hgoebl“如果您必须在您提供的功能中访问此功能”。我知道<代码>此
    提供我将呼叫的服务!。。。在阅读这个问题的答案时,我学到了一些新的东西(当然在hgoebl的编辑中有暗示);lambda又名“胖箭头”,当您需要子组件上的返回值时,这是一种使用
    @Input
    而不是
    @Output
    的好方法。@TheRedPea,我相信lambda(胖箭头)可以工作,因为它们创建了一个闭包,可以在词法环境中锁定变量。我在下面一行中遇到了错误行let isValid=this.onBeforeAddingProcessor(value)中的“找不到名称值”;如何访问此。onBeforeAddingProcessor??