#observable #angular8 #ng-zorro-antd
#наблюдаемый #angular8 #ng-zorro-antd
Вопрос:
Привет, у меня есть родительский компонент, который позволяет выбирать разные поля. Я использую селектор даты nz-zorro и выбираю компоненты. Например, дата из селектора даты, пара строк из выпадающих полей выбора и т.д. Я понял, что вы можете использовать событие субъекта для внесения изменений во входные данные дочерних компонентов при вызове любого из обратных вызовов отдельных селекторов полей.
Мне кажется, что создание события / ввода / вывода для каждой переменной — это повторяющийся шаблон, которого можно избежать, сопоставив все эти поля, которые меня интересуют, с одной моделью.
Тогда возникает мой вопрос: как мне синхронизировать изменения с любым полем модели в одной функции или способом вставки без кода….
var1DateEvent: Subject <Date> = new Subject <Date>();
var2StringEvent: Subject <string> = new Subject <string>();
Вместо того, чтобы
onvar1Change(){ this.var1DateEvent.next(this.ngModelDate)}
onvar2Change(){ thos.var2StringEvent.next(this.ngModelString)}
Где переменные модели — это модели, сопоставленные с моими компонентами пользовательского интерфейса, а onvar1Change() — это обратный вызов, сопоставленный с этим элементом пользовательского интерфейса, дочерний компонент подписывается на эти входные данные, наблюдаемые внутри его файла инициализации.
Что я хотел бы сделать, так это иметь пользовательскую модель, в которой есть все эти изменяемые поля, и всякий раз, когда изменяется какое-либо поле модели, пользовательский интерфейс отправляет дочернему компоненту событие всей модели. Мне кажется, что это лучший шаблон, но я не уверен, как это сделать, поскольку я новичок в Angular.
Ответ №1:
Если у вас есть родительско-дочернее отношение в вашем компоненте, нет необходимости использовать subject observable , я предлагаю вам использовать @Input и @Output для синхронизации изменений в вашем дочернем компоненте
- сначала в вашем родительском компоненте создайте переменную:
var1DateEvent:any;
- В вашем HTML-файле, в котором вы вызываете дочерний компонент, вставьте этот код:
<your-app-selector-name [var1DateEvent]="var1DateEvent" ></your-app-selector-name
- В вашем дочернем компоненте поместите:
@Input() var1DateEvent;
и вызовите ngOnChanges() :
ngOnChanges(){
console.log('changes from parent component',var1DateEvent);
}
также вам необходимо импортировать входные данные из :
импортируйте { Component, OnInit ,Input } из ‘@angular/core’;
Я надеюсь, что это поможет вам, спасибо
Комментарии:
1. это сработало, и это что-то фундаментальное, с чем я столкнулся, проблема в том, что nz-zorro, который я использую, не регистрирует изменения в цепочке жизненного цикла onChange
2. в nz-zorro вам нужно поместить событие обнаружения изменений, когда вы получаете выбранную дату, а затем присвоить измененное значение вашей переменной, которую вы создали для хранения даты, а затем крючок жизненного цикла ngOnChange обнаружит изменение, мне было бы понятнее, если бы вы показали код, спасибо fibonachoceres