pasar parametros example entre datos comunicacion componentes angular

parametros - viewchild angular 6



Angular 4 método de llamada padre en un componente hijo (3)

Esto me funcionó (ejemplo de documentos oficiales):

https://angular.io/api/core/EventEmitter#examples

Niño:

@Component({ selector: ''zippy'', template: ` <div class="zippy"> <div (click)="toggle()">Toggle</div> <div [hidden]="!visible"> <ng-content></ng-content> </div> </div>`}) export class Zippy { visible: boolean = true; @Output() open: EventEmitter<any> = new EventEmitter(); @Output() close: EventEmitter<any> = new EventEmitter(); toggle() { this.visible = !this.visible; if (this.visible) { this.open.emit(null); //emit event here } else { this.close.emit(null); } } }

Padre:

<zippy (open)="onOpen($event)" (close)="onClose($event)"></zippy>

Quiero llamar al método principal (deletePhone) en el componente secundario en Angular 4. ¿Cómo puedo hacerlo correctamente?

mi componente padre se ve como:

export class ContactInfo implements OnInit { phoneForm: FormGroup; phones: Phone[]; constructor(private fb: FormBuilder, private userService: UserService) { } ngOnInit() { this.userService.getDataPhones().subscribe( phones => { this.phones = phones; }); this.phoneForm = this.fb.group({ phone: ['''', [Validators.pattern(PHONE_PATTERN)]] }); } deletePhone(phone: Phone) { this.userService.deleteUserPhone(phone) .subscribe(res => { let index = this.phones.indexOf(phone); if (index > -1) { this.phones.splice(index, 1); } }); } }


No me gusta el código repetitivo como @Output (). Encontré otra solución, solo pase el objeto con cualquier número de funciones anónimas

import { Component, OnInit } from ''@angular/core''; @Component({ selector: ''app-parent'', styleUrls: [''./parent.component.css''], template: ` <app-child [parentApi]="getParentApi()"></app-child> `, }) export class ParentComponent implements OnInit { getParentApi(): ParentComponentApi { return { callParentMethod: (name) => { this.parentMethod(name) } } } constructor() { } ngOnInit() { } parentMethod(name: string) { console.log(`Hello ${name} from parent`) } } export interface ParentComponentApi { callParentMethod: (string) => void }

Y niño

import { Component, OnInit, Input } from ''@angular/core''; import { ParentComponentApi } from ''../parent/parent.component''; @Component({ selector: ''app-child'', template: `<button (click)="callParent()">call parent</button>`, styleUrls: [''./child.component.css''] }) export class ChildComponent implements OnInit { @Input() parentApi: ParentComponentApi constructor() { } callParent() { this.parentApi.callParentMethod("child") } ngOnInit() { } }

Creo que es bastante seguro hacerlo de esta manera, ¿no?


import { Output, EventEmitter } from ''@angular/core''; ... class ChildComponent { @Output() someEvent = new EventEmitter<string>(); callParent() { this.someEvent.next(''somePhone''); } }

En la plantilla de ContactInfo

<child-component (someEvent)="deletePhone($event)"