Angular 5 带参数的组件输入函数

Angular 5 Component input function that takes parameters

在 Angular 2+ 组件中,如何传入带参数的回调函数? 我最初的假设是

<app-example [onComplete]="doThing('someParam')"></app-example>

有时我不需要任何参数,像这样:

<app-example [onComplete]="doSomeThingElse()"></app-example>

然后在我的组件中

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
})
export class ExampleComponent {
  @Input() public onComplete: () => void;

  //run `this.onComplete()` somewhere as needed
}

但是,最终发生的是 doThing('someParam')doSomeThingElse() 在没有任何交互的情况下立即被调用。

我应该如何将回调函数传递给稍后调用的组件?


编辑:

我在这里试图解决的实际问题是能够在以后 运行 任何传入的函数。这是一个确认组件,它将询问用户 "are you sure you want to continue?" 然后如果他们按下 "Yes I'm sure" 按钮,传入的函数将 运行.

您可以在组件中使用私有方法:

private doThingFactory(param) {
  return () => this.doThing(param);
}

然后像这样使用它:

<app-example [onComplete]="doThingFactory('someParam')"></app-example>

这是 @toskv 寻找的 @Output 语法的示例,Angular 将回调函数作为 @Input 传递给子组件

所以对于你的例子,

<app-example 
  (onComplete)="doThing()" 
  [completedParam]="'someParam'"></app-example>
@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
})
export class ExampleComponent {
  @Output() public onComplete: EventEmitter<any> = new EventEmitter();
  @Input() completedParam;

  runOnComplete(): void {
    this.onComplete.emit(this.completedParam);
  }
}

感觉不如 [onComplete]="doThing.bind(this, 'someParam')"

模板:

<app-example [someParams]="someParamsObject"
             (complete)="onComplete($event)" >
</app-example>

组件:

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
})
export class ExampleComponent {
  @Input()
  someParams: YourParamsType;

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

  //run `this.complete(this.someParams)` somewhere as needed and 
  //pack in some params if you need
}

在您的调用中,父组件需要一个名为 onComplete 的函数,在这种情况下它接收类型为 any 的参数(来自 @Output 被定义为 EventEmitter<any>).如果需要,您还可以拥有任何您喜欢的特定类型的事件参数 EventEmitter<YourParticularType>.

仅当您有一个方法需要调用而不对组件本身采取任何操作时,上述解决方案才有效。但是,在我的例子中,我需要在 app-example 组件内部执行一个可观察的方法,并等待响应在该组件内部执行一些操作。

如果有人有同样的问题。这是它的解决方案。

  1. 创建接口。

    export interface Delegate<T> {
      (...args: any[]): T;
    }
    
  2. 在您的 angular 组件上,创建一个 @Input 变量

    @Component({
        selector: 'app-example',
        templateUrl: './example.component.html',
    })
    export class AppExampleComponent {
      @Input() executeWhen: Delegate<Observable<any>>;
    
      runOnComplete(): void {
        this.executeWhen().subscribe(() => // do some action);
      }
    }