【问题标题】:Cannot return value from EventEmitter in Angular [closed]无法从Angular中的EventEmitter返回值[关闭]
【发布时间】:2020-10-17 20:10:16
【问题描述】:

我想调用一个方法并获取以下组件之间的结果。我知道有更好的方法,例如直接从服务调用方法,但我在列表组件中使用基本组件,我需要使用 EventEmitter 来执行该方法并检索其结果。那么,如何从基本组件调用getServerData 方法并通过EventEmitter 检索其结果?当我使用以下方法时,它返回未定义。

基础组件:

@Output() request: EventEmitter<any> = new EventEmitter<any>();


list() {
    // code omitted for brevity
    const result = this.emitDataRequest(index);
    return result;
}

emitDataRequest(index) {
    return this.request.emit(index);
}

列表组件:

request(index) {
    return this.getServerData(index);
}

getServerData(index): Observable<ListOfEmployee> {
    return this.demoService.get(index);
}

【问题讨论】:

    标签: javascript angular rxjs observable


    【解决方案1】:

    EventEmitter 不能有返回值。 据我所知,您可以做两件事。

    @Input 回调

    可以将方法传递给您的子组件并在那里使用它。

    例如。

    父组件:

    // HTML
    <app-sub [parentHook]="hook.bind(this)"></app-sub>
    
    // TS
    hook(value) {
      return value;
    }
    

    子组件

    // HTML
    <button (click)="getValueFromHook()">Click me!</button>
    
    // TS
    @Input() parentHook: () => number;
    
    public getValueFromHook(): number {
      const valueFromHook = this.parentHook.call(this, 20);
      console.log(valueFromHook);
    }
    

    在你的情况下,你可以在这里返回一个 Observable。

    @Input & @Output

    您可以将数据作为@Input 传递,并在发出事件时更改它。 在您的子组件中,您可以处理 ngOnChanges 上的更改事件。

    例如:

    父组件:

    // HTML
    <app-sub
      [data]="data"
      (request)="handleRequest($event)">
    </app-sub>
    
    // TS
    public data = 5;
    
    public handleRequest(request) {
      this.data = request + this.data;
    }
    

    子组件

    // HTML
    <button (click)="request.emit(20)">Click it!</button>
    
    // TS
    @Input() data: number;
    @Output() request = new EventEmitter();
    
    ngOnChanges(changes: SimpleChanges) {
      console.log(this.data);
    }
    

    我希望这对你有用。

    @Input & @Output 与 Observables

    与前面的示例相同,但使用 observables,这样您不必使用 onChanges 生命周期

    例如:

    父组件:

    // HTML
    <app-sub
      [data$]="data"
      (request)="handleRequest($event)">
    </app-sub>
    
    // TS
    public data = new Subject();
    
    public handleRequest(index) {
      // here you can do your request to fetch some data and fill in 
      // the data$ observable with the result
      this.fetchSomeDataBasedOnIndex(index).subscribe(result => {
        this.data.next(result)
      });
    }
    

    子组件

    // HTML
    <button (click)="request.emit(20)">Click it!</button>
    
    // TS
    @Input() data$: Subject;
    @Output() request = new EventEmitter();
    
    ngOnInit(): void {
      this.data$.subscribe(d => console.log(d))
    }
    

    【讨论】:

    • You rock!.. 第一种方法(@Input 回调)工作正常,但第二种方法(@Input & @Output)不起作用,可能是由于在handleRequest 方法中使用observable ,如this.service.get().subscribe(data =&gt; { this.data = data; });。关于第二个的任何想法?也许我应该为此使用 Promise 或同步方法。
    • 顺便说一句,标记为答案并投了赞成票。实际上,在您的有用帮助下,您应该得到 5 次投票;)
    • 您始终可以将 Observable 作为 Input 传递给您的子组件,并在请求发生后发出一个新值,然后在您的子组件中订阅 Input Observable,您可以在那里处理所有更改
    • 非常感谢。您能否将其添加为第三个示例用法?你知道为什么它不起作用吗?我在分页时传递数据,这就是为什么我认为问题可能是由 observable 或 subscribe 引起的。
    • 然后我通过更新hook.bind(this) 部分更新了第一种方法,以便其他人也可以从这个有用的答案中受益。我认为编辑是正确的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2019-10-18
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多