Проверка угловой формы с использованием идентификатора div

#angular #typescript #angular-reactive-forms

#angular #typescript #угловые реактивные формы

Вопрос:

Я изо всех сил пытаюсь выполнить проверку формы с помощью этого div. Я получаю проверку, работающую с div, но как только я ввожу данные, он должен освободить удержание и установить для модели значение IsInvalid false, но оно сохраняет его равным true.

есть ли что-нибудь еще, что мне нужно сделать?

ts-файл

  initControlGroup(fb: FormBuilder) : FormGroup {
        var labelid = this.editorId;
        return fb.group({
            labelid: ["",Validators.required]        
        });
    }

onValueChange(model: SentencePartModelBase) {        
    this.modelchange.next(model);
}
  

время выполнения html

 <div id="descriptor-7c1f8c31-9327-a782-6653-6c29b3e7f279">1</div>
  

HTML

 <Descriptor [model]="model" (modelchange)="onValueChange(model)"></Descriptor>
  

Также попробовал этот же результат

  initControlGroup(fb: FormBuilder) : FormGroup {
        var labelid = this.editorId;
        return fb.group({
            [labelid]: ["",Validators.required]        
        });
    }
  

Отладчик отображает значение в виде пустой строки

 descriptor-e614bca5-d7bc-e8e3-fb99-33b735fb830c: FormControl
asyncValidator: null
dirty: (...)
disabled: (...)
enabled: (...)
value: ""
  

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

1. Я думаю, это потому, что вы закодировали labledid: вместо [lablelid]: значения, которое вы используете labelid как текст, вместо того, чтобы принимать его значение

2. @Sergey Я получаю ошибку во время выполнения, используя [lablelid]:

3. это Angular? должно быть [ngModel] и (ngModelChange). Ах! вы используете форму, управляемую шаблоном, а не реактивную форму

4. Форма, управляемая шаблоном @Eliseo

5. @Джефферсон, angular.io/guide/forms#two-way-data-binding-with-ngmodel

Ответ №1:

Кратко объясните о FormControl и FormGroup (я не уверен, что это может помочь)

В Angular у нас может быть FormControl

 control:FormControl=new FormControl('value',Validators.required)
  

Или FormGroup, это группа FormControls

 formgroup:FormGroup=new FormGroup(
{
     prop1:new FormControl('value of prop1",Validators.required),
     prop2:new FormControl('value of prop2",Validators.required)
})
  

Вы можете использовать FormBuilder для создания FormControl, но это необязательно

 formgroup:FormGroup=this.fb.group(
{
     prop1:['value of prop1",Validators.required],
     prop2:['value of prop2",Validators.required]
})
  

Ну, когда у нас есть сложный объект, обычно мы создаем функцию для создания FormGroup. Хорошо, что у него есть интерфейс, который поможет нам

 export interface Imodel
{
    prop1:string;
    prop2:string;
}
createFormGroup(data:any):FormGroup{
    data = data || {} as Imodel;
    return new FormGroup(
    {
         prop1:new FormControl(data.prop1,Validators.required),
         prop2:new FormControl(data.prop2,Validators.required)
    })
}
//so we can do in ngOnInit or in subscribe of a service:
   this.formGroup=this.createFormGroup(null) //create an empty formGroup
   this.formGroup=this.createFormGroup(data) //create an formGroup with data
  

FormControl или FormGroup существуют независимо от того, используем мы ввод или нет. Мы можем видеть в html просто write (и неплохо бы проверить наш элемент управления / FormGroup — посмотреть, как мы используем «безопасный оператор»

 {{control?.value}} - {{control?.valid}}
{{formGroup?.value|json}} - {{formGroup?.valid}}
  

Как использовать этот элемент управления в html?

 <!--for the control-->
Control:<input [formControl]="control">
<div *ngIf="control?.invalid">Control invalid</div>
  

.

 <!--for the formGroup-->
<!--I put a *ngIf to avoid errors when formGroup is null or undefined 
     (At very first of the application)-->
<div *ngIf="formGroup" formGroup="formGroup">
  <p>
    prop1:<input formControlName="prop1">
    <div *ngIf="formGroup.get('prop1')?.invalid">Prop1 required</div>
  </p>
  <p>
    prop2:<input formControlName="prop2">
    <div *ngIf="formGroup.get('prop2')?.invalid">Prop2 required</div>
  </p>
</div>
  

Наконец, когда мы используем FormControl из FormGroup, мы можем «прослушивать» изменения в собственном файле .ts (в этом нет необходимости, если мы не хотим предпринимать особых действий, например, если мы хотим видеть только некоторые, если допустимо, мы можем использовать valid в файле .html, и этов этом нет необходимости). Всегда ПОСЛЕ создания элемента управления / FormGroup

    this.formGroup=this.createFormGroup(null) //create an empty formGroup
   this.formGroup.get('prop1').valueChanges.subcribe(res=>{
           console.log(res)
   }
   //or 
   this.control.valueChanges.subcribe(res=>{
           console.log(res)
   }
  

Смотрите в официальных документах, что значение изменяется, если свойство FormControl является наблюдаемым, поэтому мы можем подписаться на это свойство

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

1. что такое «значение prop1» — это объект в модели?

2. Мы используем FormGroup, если можем получить объект. например, вы хотите получить {name:»Имя»,фамилия:»фамилия»} вы используете FormGroup . Да, это правда, что вам может понадобиться объект с уникальным свойством {name:»Name»}. Но в этом последнем случае.. почему бы просто не получить «Имя» ?. Для этого вы можете использовать FormControl, а не FormGroup — типичным случаем является поиск по вводу -. Я думаю, что такой объект, как {prop1:»…», prop2:»…»}

Ответ №2:

Может ли это быть так же просто, как орфографическая ошибка в ярлыке?

эта строка:

 [lablelid]: ["",Validators.required] 
  

должно быть

 [labelid]: ["",Validators.required] 
  

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

1. Извините, я это видел и исправил, получив тот же результат, что и раньше