Создание составных компонентов в Angular
Я хочу создать универсальный составной компонент Angular, который состоит из множества полей ввода, которые могут быть использованы внутри нескольких компонентов в приложении.
Например:
Рассмотрим компонент сведений о пользователе, который имеет следующие поля,
- Поле Email-InputText
- пол-переключатель.
- Возрастная Группа-Выпадающий Список
- Описание-Текстовая Область.
Я хочу включить этот компонент USER DETAIL в несколько компонентов как ниже:
Из общепринятого мнения я могу сказать, что я просто включаю
<app-userdetails> в несколько компонентов.Но как мне справиться с представленным FormGroupData?
Я имею в виду, как я получаю данные из UserDetail, когда он включен в другой компонент, такой как CreateEmployee?
Я не уверен, правильно ли я объяснил вышеописанный сценарий, пожалуйста, укажите мне на любые веб-примеры или существующие вопросы об этом.
1 ответ:
Итак, к вашим дочерним компонентам вы можете передать
formи добавить/удалить элементы управления ему.Шаблон родительского компонента
<form (ngSubmit)="onSubmit(form)" #form="ngForm"> <a-comp [prop1]="name" [form]=form></a-comp> <button type="submit">Submit</button> </form>Некоторый дочерний компонент:
// a comp @Component({ selector: 'a-comp', template: ` <input [(ngModel)]="prop1" name="name2" #myControl="ngModel"/> ` }) export class AComponent { @Input() form: NgForm; @Input() prop1 = 'Angular 5'; @ViewChild('myControl') myControl: NgModel; ngOnInit() { //console.log(this.form, this.myControl); this.form.addControl(this.myControl); } }Передача
@Inputчайлдсу не нужна. Но дочерние компоненты должны знать оform.2. Самый простой способ . Используя силу
DIДочерний компонент. В вашем случае UserDetails:
Как вы можете видеть в декораторах@Component({ selector: 'a-comp', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: ` <input [(ngModel)]="prop1" name="prop1"/> <input [(ngModel)]="prop2" name="prop2"/> ` }) export class AComponent { prop1 = 'Hello'; prop2 = 'World'; ngOnInit() { } }@Component, мы устанавливаемviewProviders. Поэтому, требуяControlContainer, мы говоримuseExisting: NgForm. По угловой системеDIон пойдет вверх, чтобы найти первого родителяNgForm.ViewProviders = определяет набор видимых вводимых объектов к ее мнению дом дети.
...
Вы, возможно, можете спросить: по механизму
DIон должен искать провайдера до корень, но почему он не поднимается в hirearchy и не находит родителяNgForm?Constuctor of
ngModel:constructor(@Optional() @Host() parent: ControlContainer, @Optional() @Self() @Inject(NG_VALIDATORS) validators: Array<Validator|ValidatorFn>, @Optional() @Self() @Inject(NG_ASYNC_VALIDATORS) asyncValidators: Array<AsyncValidator|AsyncValidatorFn>, @Optional() @Self() @Inject(NG_VALUE_ACCESSOR) valueAccessors: ControlValueAccessor[]) { ...Обратите внимание на
@Optional() @Host() parent: ControlContainer. Это @Optional и @Host ().@Host - указывает, что инжектор должен получить зависимость от любой инжектор до достижения ведущего элемента текущего компонента.
Итак, здесь
При таком подходе нет необходимости создавать привязку@Host()декораторы ограничиваютngModelпоиск только доhostкомпонента, гдеngModelвыделяется.@Inputв дочерних компонентах, чтобы получить родительскиеNgFormи добавить элементы управления NgModels вручную.

Comments