Htmlколлекция пуста при отправке формы

#angular

Вопрос:

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

 document.getElementsByClassName('ng-invalid');
 

но HTMLCollection он пуст (длина 0).
Я не понимаю, почему?

Вот моя анкета:

 <div class="container rounded bg-white mt-5 mb-5">
    <form [formGroup]="myForm" name="myForm" autocomplete="off" novalidate (ngSubmit)="updateUserAccount(myForm.value)">
    <div class="row">
        <div class="col-md-3 border-right">
            <div class="d-flex flex-column align-items-center text-center p-3 py-5">
                <img class="rounded-circle mt-5" width="150px" src="https://st3.depositphotos.com/15648834/17930/v/600/depositphotos_179308454-stock-illustration-unknown-person-silhouette-glasses-profile.jpg">
                    <span class="font-weight-bold">{{user?.firstName}} {{user?.lastName}}</span>
                    <span class="text-black-50">{{user?.mail}}</span>
                    <span></span>
            </div>
        </div>
        <div class="col-md-5 border-right">
            <div class="p-3 py-5">
                <div class="d-flex justify-content-between align-items-center mb-3">
                    <h4 class="text-right color-secondary">Profile</h4>
                    <div class="row">
                        <div class="col-md-12 align-ietms-center">
                            <button class="btn btn-outline-primary" type="submit">Liste utilisateurs</button>
                        </div>
                    </div>
                </div>
                <div class="row mt-2">
                    <div class="col-md-12">
                        <app-gender name="gender" id="gender" [formGroup]="myForm" [selectedValue]="user?.gender?.description">
                            <em *ngIf="validateControl('gender') amp;amp; hasError('gender', 'required')">Sélectionnez un genre</em>
                        </app-gender>      
                    </div>
                </div>
                <div class="row mt-2">
                    <div class="col-md-6"><label class="labels">Nom</label><input type="text" class="form-control" formControlName="lastname" placeholder="Nom" value="{{user?.firstName}}" >
                        <em *ngIf="validateControl('lastname') amp;amp; hasError('lastname', 'required')">Nom obligatoire</em>
                    </div>
                    <div class="col-md-6"><label class="labels">Prénom</label><input type="text" class="form-control"  formControlName="firstname" value="{{user?.lastName}}" placeholder="Prénom" >
                        <em *ngIf="validateControl('firstname') amp;amp; hasError('firstname', 'required')">Prénom obligatoire</em>
                    </div>
                </div>
                <div class="row mt-3">
                    <div class="col-md-12 mt-2"><label class="labels">Nom d'utilisateur</label><input type="text" class="form-control" formControlName="username" placeholder="Nom d'utilisateur" value="{{user?.userName}}" >
                        <em *ngIf="validateControl('username') amp;amp; hasError('username', 'required')">Nom d'utiliateur obligatoire</em>
                    </div>
                    <div class="col-md-12 mt-2"><label class="labels">Mail</label><input type="text" class="form-control" formControlName="mail" placeholder="Mail" value="{{user?.mail}}" >
                        <em *ngIf="validateControl('mail') amp;amp; hasError('mail', 'required')">Mail obligatoire</em>
                    </div>
                    <div class="col-md-12 mt-2"><label class="labels">Login</label><input type="text" class="form-control" formControlName="login" placeholder="Login" value="{{user?.login}}" >
                        <em *ngIf="validateControl('login') amp;amp; hasError('login', 'required')">Login obligatoire</em>
                    </div>
                    <div class="col-md-12 mt-2"><label class="labels">Password</label><input type="text" class="form-control" formControlName="password" placeholder="Password" value="{{user?.password}}" >
                        <em *ngIf="validateControl('password') amp;amp; hasError('password', 'required')">Mot de passe obligatoire</em>
                    </div>
                   </div>
                    <div class="row mt-3">
                        <div class="col-md-12">
                            <label class="labels">Type d'utilisateur</label>
                            <app-useraccount-type name="useraccountType" id="useraccountType" [formGroup]="myForm" [selectedValue]="user?.userAccountType?.shortDescription">
                                <em *ngIf="validateControl('useraccountType') amp;amp; hasError('useraccountType', 'required')">Mot de passe obligatoire</em> 
                            </app-useraccount-type>      
                        </div>

                    </div>
                <div class="mt-5 text-center"><button class="btn btn-primary profile-button" type="submit">Sauvegarder</button></div>
            </div>
        </div>
        <div class="col-md-4">
        </div>
    </div>
    </form>
</div>
 

и метод проверки, который является основным на данный момент:

 private getFormFields() {
this.myForm = new FormGroup({
      firstname: new FormControl('', [Validators.required]),
      lastname: new FormControl('', [Validators.required]),
      mail: new FormControl(''),
      gender: new FormControl(''),
      password: new FormControl(''),
      username: new FormControl(''),
      login: new FormControl(''),
      useraccountType: new FormControl('')
    });
}
 

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

На самом деле, когда я отправляю свою форму, я проверяю это:

 console.log(myForm.value);
 

и он пуст.

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

1. Не рекомендовал бы использовать validateControl(‘xyz’) внутри функции ngIf, так как она будет часто вызываться, чтобы быть точным, при каждом рендеринге. И это еще до того, как у пользователя появится возможность ввести имя или фамилию, это может быть причиной того, что у вас с самого начала был неверный. Действительность формы можно проверить при обмене, чтобы быть более ленивым

2. Если вы можете предоставить минимальный пакет с вашим отсутствующим машинописным текстом, мы могли бы помочь в дальнейшем

3. Спасибо за вашу помощь. Вот ссылка на ссылку stackblitz. Некоторые занятия отсутствуют.

4. stackblitz.com/edit/… Удалил все внешние ссылки и сумел запустить вышеупомянутый stackblitz, также внес несколько изменений, срок действия формы правильный, я не вижу никаких проблем

5. Пожалуйста, предоставьте весь соответствующий код здесь для переполнения стека, а не только для Stackblitz. @Simplicity_strength Ваш ответ не будет иметь никакого смысла для будущих посетителей, если эта ссылка на Stackblitz будет удалена или пользователь не сможет получить к ней доступ.

Ответ №1:

Следующий раздел stackblitz, разветвленный из комментариев, работает должным образом, для устранения неполадок в коде машинописи потребовались некоторые изменения.

Несколько ключевых моментов: updateUserAccount(myForm.value) вызов проверял, является ли значение допустимым ключом, а не самой формой updateUserAccount(myForm)

 public myForm: FormGroup;

updateUserAccount = (myForm: FormGroup) => {
    // ...
    if (myForm.valid) {
      console.log('VALID');
    } else {
      // ...
      console.log('Is not Valid');
    }
  }
 

Как указано в комментариях, звонить validateControl('xyz') в службу *ngIf не требовалось, достаточно было одной проверки hasError('xyz') .

 <em *ngIf="validateControl('firstname') amp;amp; hasError('firstname', 'required')">
    Prénom obligatoire
</em>
 

Изменено на

 <em *ngIf="hasError('firstname', 'required')">
   Prénom obligatoire
</em>
 
 hasError = (controlName: string, errorName: string) => {
    return this.myForm.controls[controlName].hasError(errorName);
};
 

Использовал updateValueAndValidity() функцию AsbstractControl проверки валидности при нажатии, когда это необходимо, хотя FormControl уже делает это при обмене

Использование document.getElementsByClassName('ng-invalid'); собственных селекторов js не должно быть необходимым, когда мы можем напрямую использовать свойство FormGroup.valid, поскольку оно дешевле в вычислении и проще в доступе из углового кода

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

1. Спасибо за ваши объяснения. Теперь, кажется, все в порядке для проверки, но теперь у меня ошибка 400 с http.put. Метод Api в порядке. Проверил это.

Ответ №2:

Проблема решается с помощью решения простоты и прочности. Спасибо за вашу помощь.