Формы Angular2: проверки, ngControl, ngModel и т. д.

Работаю над бета-версией angular2 Forms. после долгих поисков ничего полезного не нашел. надеюсь, здесь кто-нибудь поможет мне.

В основном я немного запутался, как правильно использовать формы в angular2 (например, используя ngControl, ngFormControl и т. д.). я создал один plnkr здесь

http://plnkr.co/edit/fictP28Vqn74YqrwM1jW?p=preview

вот мой .html код: -

<form class="form-horizontal" id='myForm' role="form" [ngFormModel]="CreateGroup">

  <div class="col-md-7">
Name: <input type="text" id="name" placeholder="Name" class="form-control" ngControl="name">
  </div>
  <div class="col-md-7">
  Password:   <input type="text" id="password" placeholder="password" class="form-control" ngControl="password">
  </div>

  <div class="col-md-7">
    <input type="radio" name='type'>Btech
    <input type="radio" name='type'>Mtech
  </div>

  <div class="col-md-7">
    <input type="checkbox" >Math
    <input type="checkbox">English
    <input type="checkbox">Science
  </div>
  <br>
  <div class="col-md-7">
    <select #selectOption (change)='getValue(selectOption.value)' class='form-control'>
      <option value='1'>One Value</option>
      <option value='2'>two Value</option>
      <option value='3'>Three Value</option>
    </select>
  </div>
</form>
<button type="button" (click)="addNewGroup(CreateGroup.value)" class="btn btn-primary btn-lg"> Create </button>

и код .ts здесь: -

CreateGroup: FormBuilder;
  constructor(fb: FormBuilder){
    console.log('form called');

    this.CreateGroup = fb.group({
            'name': new Control(),
            'password': new Control()
        })
  }
  addNewGroup(value) {
    console.log(value);
    document.getElementById("myForm").reset();
  }

  getValue(value){
    console.log(value);
  }

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

Q1: - Как получить значения радио, флажка, выбрать, используя форму в angular2. (я не хочу вызывать хук change для опции выбора, как я использовал в plnkr).

Q2:- так как в plnkr после отправки данных форма управления не сбрасывалась. Контроль над формой остается, но форма кажется сброшенной. так как сбросить управление формами в angular2.

Q3: - Какой лучший способ использовать проверку в формах (если у кого-то есть plnkr, показывающий проверку, опубликуйте его).

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

http://blog.ng-book.com/the-ultimate-guide-to-forms-in-angular-2


person Pardeep Jain    schedule 13.02.2016    source источник
comment
@Gunter кажется, тебе всегда нравится шпионить за вопросами angular2: p ты отвечаешь на каждый мой вопрос. здесь я тоже ожидаю хорошо объясненного ответа с вашей стороны :) спасибо за редактирование вопроса.   -  person Pardeep Jain    schedule 14.02.2016
comment
Конечно. Всегда стремлюсь узнать что-то новое :), проверяя, что пробуют другие и могу ли я ответить. Это отличный вопрос с еще большим ответом.   -  person Günter Zöchbauer    schedule 14.02.2016


Ответы (2)


Привязка элементов управления формы к модели предметной области

Инициализируйте модель предметной области в вашем компоненте:

constructor(){
  this.student = new Student();
}

Используйте ngModel для привязки элементов управления формы к модели предметной области с двусторонней привязкой модели.

Name: <input [(ngModel)]="student.name" type="text">
Password:  <input [(ngModel)]="student.password" type="text">

Когда кнопка нажата, передайте модель предметной области в качестве аргумента:

<button type="button" (click)="addNewGroup(student)">Create</button>

Реализуйте метод addNewGroup. Чтобы сбросить форму, обновите модель предметной области новой моделью:

addNewGroup(student:Student) {
  alert('added ' + student.name);
  this.student = new Student();
}

Демонстрационный план

Добавление валидаторов в форму

Чтобы добавить проверку формы, добавьте ngFormModel к элементу формы и добавьте декораторы ngControl к каждому элементу ввода (ngControl — синтаксический сахар для [ngFormControl]="studentForm.controls['name']"):

<form [ngFormModel]="studentForm" />
   <input type="text" ngControl="name" />
   <input type="text" ngControl="password" />
</form>

ngFormModel сопоставляется со свойством ControlGroup вашего компонента. Инициализируйте ControlGroup с помощью объекта конфигурации, имена свойств которого соответствуют значениям атрибутов ngControl:

constructor(fb: FormBuilder){
  this.student = new Student();
  this.studentForm = fb.group({
     'name': new Control(this.student.name, Validators.required),
     'password': new Control(this.student.password, Validators.required)
  });
}

В приведенном выше примере встроенный валидатор required используется для указания того, что имя и пароль являются обязательными полями. Затем вы можете проверить, действительна ли вся форма, используя свойство valid в модели формы:

addNewGroup(student:Student) {
    if (this.studentForm.valid) {
      alert('added ' + student.name);
      this.student = new Student();
    }
    else {
      alert('form is not valid!');
    }
}

Демонстрационный план

Отображение сообщений проверки

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

 <input ngControl="name" #name="ngForm" type="text">
 <span [hidden]="name.valid"><b>Required</b></span>

Демонстрационный план

Если вы хотите создать свой собственный валидатор, создайте метод, возвращающий объект проверки, чьи свойства boolean соответствуют ошибкам проверки. Например, вы можете создать валидатор, который гарантирует, что первая буква пароля должна быть числовой:

interface ValidationResult {
 [key:string]:boolean;
}
class PasswordValidator {
 static startsWithNumber(control: Control): ValidationResult { 
   if ( control.value && control.value.length > 0){
     if (isNaN(control.value[0]))
      return { 'startsWithNumber': true };
   }

   return null;
 } 
}

Собираем валидаторы вместе в один валидатор и передаем его конструктору Control с помощью встроенного Validators.compose:

this.studentForm = fb.group({
   'name': new Control(this.student.name, Validators.required),
   'password': new Control(this.student.password, Validators.compose([Validators.required,PasswordValidator.startsWithNumber])),
});

Если у вас есть несколько валидаторов на одном и том же Control, используйте объект errors, чтобы различать их:

<input ngControl="password" #password="ngForm" />
<span [hidden]="!password.control.hasError('required')"><b>Required</b></span>
<span [hidden]="!password.control.hasError('startsWithNumber')"><b>Must start with number</b></span>

Демонстрационный план

Привязка к спискам радиокнопок

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

Angular2 — привязка переключателя

person pixelbits    schedule 13.02.2016
comment
Большое вам спасибо за ваше время. я еще не пробовал ни один из этих методов, которые вы опубликовали, но я надеюсь, что это прояснит многие моменты. Но да, еще кое-что в своем ответе вы ничего не опубликовали о checkboxes и select options, если у вас есть какие-либо вопросы, связанные с этим, пожалуйста, обновите свой ответ. +1 за отличные объяснения и предоставление plnkr, еще раз спасибо :) - person Pardeep Jain; 14.02.2016
comment
отличная работа. но после отправки второго и третьего plnkr возникает ошибка (проверка и сообщение об ошибке plnkr). пожалуйста, вы удалите его? - person Pardeep Jain; 14.02.2016
comment
Да, я тоже это заметил. Это связано с отображением {{ form.valid }} в демонстрационных целях. Ошибка привязки изменилась с момента последней проверки. Я думаю, что это должна исправить команда Angular. Однако, чтобы исправить демо, я просто переместил привязку вниз. - person pixelbits; 14.02.2016
comment
beta6, я полагаю, имеет привязку к переключателям github.com/angular/angular/blob /master/CHANGELOG.md] - person Paul Whelan; 15.02.2016

ОБНОВЛЕНО - ФОРМЫ ANGULAR2 RC4

TL;DR;

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

По сути, есть два способа создания форм в Angular 2, а именно на основе шаблона и на основе модели. Базовая структура использования форм следующая:

  • беги npm install @angular/forms --save
  • настройте метод начальной загрузки для вашего приложения следующим образом:

    bootstrap(AppComponent, [
      disableDeprecatedForms(), // disable deprecated forms
      provideForms(), // enable new forms module
    ]);
    
  • используйте REACTIVE_FORM_DIRECTIVES для директив компонентов, чтобы использовать функциональные возможности форм.

  • создать переменную формы типа FormGroup
  • Используйте Validators для проверки.

кроме того, FormBuilder не является обязательным для создания форм, управляемых моделью, но упрощает синтаксис. существует три основных синтаксиса/метода, предоставляемых конструктором форм:

  • группа: создайте новую группу форм.
  • массив: создание нового массива форм.
  • элемент управления: создайте новый элемент управления формой.

Это основные шаги по использованию форм в angular2 RC.

Полезные ресурсы для форм angular2:

Живая демонстрация того же здесь

Рабочая демонстрация форм angular2

person Pardeep Jain    schedule 09.08.2016
comment
RC.5 был только что выпущен, и это было изменено: p - person Günter Zöchbauer; 09.08.2016
comment
ааа ... так что давайте посмотрим на новые изменения: p снова опубликуем новый ответ после того, как узнаем что-то новое: p - person Pardeep Jain; 09.08.2016