Как создать повторно используемый компонент с пользовательской конфигурацией кнопок

#angular #angular-reactive-forms #viewchild #ng-template #ng-content

#angular #angular-реактивные формы #viewchild #ng-template #ng-content

Вопрос:

Итак, в настоящее время у меня есть компонент, который имеет несколько кнопок, настраиваемых с помощью опций:

test.component.html

 <button
    *ngIf="cleaning"
    (click)="onCleaning()"
>
    {{'btn.cleaning'|translate}}
</button>

<button
    *ngIf="remove"
    (click)="onRemoving()"
>
    {{'btn.remove'|translate}}
</button>
  

test.component.ts

 @Input() cleaning: boolean;
@Input() remove: boolean;
cleaningForm: FormGroup;
  

parent.component.html

 <test [cleaning]="true" [remove]="false"></test>
  

И идея в том, что этот компонент намного больше и многоразовый, где меняются только кнопки и действия, которые будут нажаты, но для этого всегда требуется форма.

Есть ли другое лучшее решение для получения такого компонента, используя ng-content и как-то запуская форму в родительском компоненте?

Ответ №1:

Не совсем уверен, хотите ли вы предоставить все кнопки и их методы (щелчка), или этот компонент должен просто выполнять заданные входные данные с очень небольшим количеством логики сам по себе. Последнее интересно, если вы хотите настроить повторно используемые компоненты, такие как всплывающее окно с заданными кнопками.

Вы могли бы использовать не только элементы, но и их функциональность.

Parent.ts

 export class ParentComponent implements OnInit {
  public cbFunction: (e: MouseEvent) => void //or whatever return value

  public ngOnInit(): void {
    this.cbFunction = ((e: MouseEvent) => { this.doFancyStuff(); }).bind(this);
  }
}
  

Parent.html

 <child [callback]="cbFunction" name="cbFktBtn"></child>
  

Дочерний файл.ts

 export class ChildComonent {
   @Input() callback: (e: MouseEvent) => void;
   @Input() name: string;
}
  

Child.html

 <button (click)="callback($event)">{{name}}</button>
  

Это, очевидно, также работает с массивами кнопок (или наборами, или картами, или чем-то еще).