Как передать событие от родителя к ребенку?
В настоящее время я использую Angular 2. Обычно мы используем @Output() addTab = new EventEmitter<any>();
а затем addTab.emit()
для addTab.emit()
события родительскому компоненту.
Есть ли способ, как мы можем сделать это вице, от родителя к ребенку?
Ответы
Ответ 1
Используя RxJs, вы можете объявить объект в своем родительском компоненте и передать его как наблюдаемый для дочернего компонента, дочерний компонент просто должен подписаться на этот Observable.
Родитель-компонентный
private eventsSubject: Subject<void> = new Subject<void>();
emitEventToChild() {
this.eventsSubject.next()
}
Родитель-HTML
<child [events]="eventsSubject.asObservable()"> </child>
Ребенок-компонентная
private eventsSubscription: any
@Input() events: Observable<void>;
ngOnInit(){
this.eventsSubscription = this.events.subscribe(() => doSomething())
}
ngOnDestroy() {
this.eventsSubscription.unsubscribe()
}
Ответ 2
Насколько я знаю, есть 2 стандартных способа сделать это.
1. @Input
Всякий раз, когда изменяются данные в родительском элементе, дочерний элемент получает уведомление об этом в методе ngOnChanges. Ребенок может действовать на это. Это стандартный способ взаимодействия с ребенком.
Parent-Component
public inputToChild: Object;
Parent-HTML
<child [data]="inputToChild"> </child>
Child-Component: @Input() data;
ngOnChanges(changes: { [property: string]: SimpleChange }){
// Extract changes to the input property by its name
let change: SimpleChange = changes['data'];
// Whenever the data in the parent changes, this method gets triggered. You
can act on the changes here. You will have both the previous value and the
current value here.
}
- Концепция общего сервиса
Создание сервиса и использование наблюдаемого в общем сервисе. Ребенок подписывается на него, и всякий раз, когда есть изменение, ребенок будет уведомлен. Это также популярный метод. Если вы хотите отправить что-то кроме данных, которые вы передаете в качестве ввода, это можно использовать.
SharedService
subject: Subject<Object>;
Parent-Component
constructor(sharedService: SharedService)
this.sharedService.subject.next(data);
Child-Component
constructor(sharedService: SharedService)
this.sharedService.subject.subscribe((data)=>{
// Whenever the parent emits using the next method, you can receive the data
in here and act on it.})
Ответ 3
Используйте декоратор @Input() в дочернем компоненте, чтобы родитель мог привязываться к этому вводу.
В дочернем компоненте вы объявляете его как есть:
@Input() myInputName: myType
Чтобы привязать свойство от родителя к ребенку, вы должны добавить в свой шаблон привязывающие скобки и имя вашего ввода между ними.
Пример:
<my-child-component [myChildInputName]="myParentVar"></my-child-component>
Но будьте осторожны, объекты передаются как ссылка, поэтому, если объект обновляется в дочернем, родительский var будет слишком обновляться. Иногда это может привести к некоторому нежелательному поведению. С первичными типами значение копируется.
Чтобы продолжить читать:
Документы: https://angular.io/docs/ts/latest/cookbook/component-communication.html
Ответ 4
В родительском компоненте вы можете использовать @ViewChild() для доступа к методу/переменной дочернего компонента.
@Component({
selector: 'app-number-parent',
templateUrl: './number-parent.component.html'
})
export class NumberParentComponent {
@ViewChild(NumberComponent)
private numberComponent: NumberComponent;
increase() {
this.numberComponent.increaseByOne();
}
decrease() {
this.numberComponent.decreaseByOne();
}
}
Ответ 5
Внутри родителя вы можете связать ребенка с помощью @ViewChild. Когда это необходимо (т.е. Когда событие будет запущено), вы можете просто выполнить метод в дочернем элементе из родителя, используя ссылку @ViewChild.