Angular получает статус всех дочерних компонентов из родительского компонента

#javascript #angular

#javascript #angular

Вопрос:

У меня есть компоненты ‘Parent’ и ‘Child’.Из родительского мы можем добавлять или удалять дочерний компонент. таким образом, дочерние компоненты являются динамическими. в родительском я отрисовал дочерний компонент в цикле, как показано ниже

Parent.component.html

 <child *ngFor="let child of children" [data]="child"></child>
  

Теперь в дочерний компонент я добавил функцию с именем isValid(), чтобы проверить, действителен дочерний компонент или нет

Child.component.ts

 IsValid()
{
  //check validity of component and return true if valid else false
}
  

в родительском компоненте у меня есть кнопка под названием «Сохранить», я должен включить эту кнопку, если все дочерние компоненты действительны, иначе нужно отключить эту кнопку.

Итак, мне нужен способ вызвать функцию isValid дочерних компонентов для каждого дочернего компонента из родительского, а затем определить результат достоверности и применить его к кнопке сохранения, чтобы включить или отключить

Что я пробовал

1. Я отправил действительный или недопустимый результат от дочернего элемента к родительскому, и если какой-либо дочерний результат недействителен, я отключил кнопку сохранения.

но проблема вот в чем: если я добавил одного дочернего компонента, сделайте его действительным, кнопка сохранения будет включена. теперь я добавил еще одного дочернего компонента, который является недопустимым, поэтому кнопка сохранения будет отключена, но если я удалю недопустимую дочернюю кнопку сохранения, она будет отключена, хотя у нас есть только один дочерний компонент, который действителен .. поскольку событие isValid отправляется, только если текущий дочерний компонент получает изменения.

2. Я могу использовать что-то вроде этого

 <child #varName></child>

@ViewChild('varName') childElement;
  

и затем из родительского я могу вызвать

 childElement.IsValid() 
  

но поскольку я отрисовал дочерние компоненты в цикле, как дать уникальное имя в цикле и как добавить ссылку на этот уникальный HTML-тег в ts-файле.

Я создал здесь case SlackBlitz

Мы будем признательны за любую помощь. Спасибо

Комментарии:

1. Пожалуйста, попробуйте создать (минимальный) StackBlitz демонстрирует проблему.

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

3. @Jeto создал обращение по указанному URL .. обновленный вопрос .. спасибо

Ответ №1:

Возможно, вы захотите использовать @ViewChildren

В вашем родительском компоненте:

 @ViewChildren(ChildComponent) children: QueryList<ChildComponent>;

areChildrenValid(): boolean {
   const invalid = this.children.some(c => !c.IsValid());
   return !invalid;
}
  

Обратите внимание, что children будет определено после AfterViewInit перехвата.

Ответ №2:

@angular/core предоставляет ViewChildren и QueryList , вероятно, это должно вам помочь.

 <child #varName></child>
import { ViewChildren, QueryList } from '@angular/core';
@ViewChildren("varName") customComponentChildren: QueryList<YourComponent>;

this.customComponentChildren.forEach((child) => { let retult = child.IsValid(); })
  

Ответ №3:

Вы могли бы использовать Component selector:

 @ViewChildren(ChildComponent) childrenList: QueryList<ChildComponent>;
  

и запускает цикл через него и определяет достоверность.