通过 Angular 组件将函数作为参数传递给(单击)事件

pre*_*vox 7 components input selector angular

我正在尝试创建一个带有取消和发送按钮的组件以避免每个表单上的 c&p 但我找不到将函数作为参数传递给组件选择器的方法

HTML:

<btn-submit [cancelFunction]='test' [acceptFunction]='test'></btn-submit>
Run Code Online (Sandbox Code Playgroud)

TS家长:

test = () => console.log("this is a test");
Run Code Online (Sandbox Code Playgroud)

TS孩子:

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

@Component({
  selector: 'btn-submit',
  styleUrls: ['./btn.component.scss'],
  template: `
          <button class="btn" click="cancelFunction()">
              <fa name="times"></fa>
          </button>
          <button class="btn" click="acceptFunction()">
              <fa name="check"></fa>
          </button>
  `
})

export class BtnSubmitComponent {
  @Input() cancelFunction: any;
  @Input() acceptFunction: any;
}
Run Code Online (Sandbox Code Playgroud)

Deb*_*ahK 9

如果您想实际将一个函数从父组件传递给子组件,您可以按照下面的代码所示进行操作。

但是使用其他答案中显示的更常见@OutputEventEmitter方法可能是更好的选择。@Output 技术不允许您传入函数,但允许您的父组件从子组件接收事件,您可以通过调用父组件中的函数来响应这些事件。

这是允许您将函数从父组件传递到子组件的代码。

父组件

test = () => console.log("this is a test");
Run Code Online (Sandbox Code Playgroud)

父模板

          <pm-star [rating]='product.starRating'
                   [testFunction]='test'
                   (ratingClicked)='onRatingClicked($event)'>
          </pm-star>
Run Code Online (Sandbox Code Playgroud)

注意方括号(属性绑定),它不会调用函数,而是绑定到包含该函数的组件的属性。

子组件

  @Input() testFunction: any;
Run Code Online (Sandbox Code Playgroud)

子模板

<div class="crop"
     [style.width.px]="starWidth"
     [title]="rating"
     (click)="testFunction()">
Run Code Online (Sandbox Code Playgroud)

我在这里有一个简单的工作示例的 stackblitz:https ://stackblitz.com/edit/angular-jwguwk?file=src%2Fapp%2Fapp.component.ts


Jam*_*ose 5

您可以将@Output装饰器与EventEmitter类结合使用来实现此目的

子组件(打字稿和标记)

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

        @Component({
          selector: 'btn-submit',
          styleUrls: ['./btn.component.scss'],
          template: `
                  <button class="btn" click="cancelFunction()">
                      <fa name="times"></fa>
                  </button>
                  <button class="btn" click="acceptFunction()">
                      <fa name="check"></fa>
                  </button>
          `
        })

        export class BtnSubmitComponent {
          @Output() clicked: EventEmitter<any> = new EventEmitter();
          cancelFunction(){
            this.clicked.emit("CANCELLED"); // Pass any payload as argument
          }
          acceptFunction{
            this.clicked.emit("ACCEPTED"); // Pass any payload as argument
          }
        }
Run Code Online (Sandbox Code Playgroud)

父标记

<btn-submit (clicked)="onAddClicked($event)" [acceptFunction]='test'></btn-submit>
Run Code Online (Sandbox Code Playgroud)

父打字稿功能

onAddClicked(event: any){
console.log(event); // Your payload is in 'event'
}
Run Code Online (Sandbox Code Playgroud)