Как сформировать валидацию свойства без модели в угловых - PullRequest
0 голосов
/ 06 июня 2019

У меня есть 2 текстовых поля в угловых HTML имя и дата .. Но я не сопоставил это ни с одной моделью. Как сделать проверку для этого?

Когда я google, все проверки основаны только на ngModel. Как выполнить проверку для свойства компонента, которое не является свойством модели?

Заранее спасибо.

редактирование:

 <form #dartForm='ngForm' (ngSubmit)='onSubmit(inputName.value, inputDate.value)'>
      <div class="row">
        <div class="form-group col col-12">
          <div class="form-group col col-6">
            <label for="username">Name: </label>
            <select #inputName class="form-control" id="username">
              <option>SELECT</option>
              <option>Monicka</option>
              <option>Hema</option>
              <option>Ramesh</option>
              <option>Madhavan</option>
              <option>Aadhavan</option>
              <option>Madhan</option>
              <option>Prasanth</option>
            </select>
          </div>
          <div class="form-group col col-6">
            <label for="date">Date:</label>
            <input type="text" #inputDate class="form-control" id="date">
          </div>
        </div>
      </div>
      <div class="form-group">
        <button class="btn btn-primary" type='submit'>Search</button>
      </div>
    </form>


export class PlannerComponent implements OnInit {

  constructor(private dartService: DartService) { }
  curDate = new Date();
  name: string;
  date: Date = this.curDate;
  darts: Dart[] = [];

В этом я хочу подтвердить имя и дату ...

1 Ответ

1 голос
/ 06 июня 2019

Я думаю, вы должны просто использовать то, что предлагает Angular:

  • Шаблонные формы
  • Реактивные формы

Выберите свой выбор.Мои личные предпочтения всегда связаны с реактивными формами, так как мы создали библиотеку под названием ngx-sub-form , которая дает нам множество преимуществ, таких как безопасность типов, разбиение формы на подформы, доступ к вложенным ошибкам иподробнее.

Чтобы создать то, что вы упомянули в своем посте, я бы сделал это следующим образом:

  • Создайте «умный» компонент, который будет извлекать ваши имена (изсервер, локальное хранилище, хранилище и т. д.)
  • Создайте компонент формы, который будет обрабатывать все части формы и возвращать ожидаемый объект только после того, как он будет сохранен

Вотдемонстрация того, как это сделать с помощью ngx-sub-form: https://stackblitz.com/edit/angular-knhgk5

Теперь давайте дадим некоторые подробности:

Прежде всего, давайте напишем наш интерфейс!

planner.interface.ts

export interface Planner {
  name: string;
  date: string;
}

Тогда давайте создадим умный компонент:

planner-container.component.ts

@Component({
  selector: 'app-planner-container',
  templateUrl: './planner-container.component.html',
  styleUrls: ['./planner-container.component.css']
})
export class PlannerContainerComponent {
  // those names would probably be fetched from a server
  // but hardcoded for the sake of simplicity in the demo
  public names: string[] = [
    'Monicka',
    'Hema',
    'Ramesh',
    'Madhavan',
    'Aadhavan',
    'Madhan',
    'Prasanth',
  ];

  public save(value: Planner): void {
    // todo: do whatever you want here
    // this method will be run only once the form is valid and sent
    console.log('Form has been sent!');
    console.log(value);
  }
}

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

Самая важная часть: форма

planner-form.component.ts

@Component({
  selector: 'app-planner-form',
  templateUrl: './planner-form.component.html',
  styleUrls: ['./planner-form.component.css']
})
export class PlannerFormComponent extends NgxSubFormComponent<Planner> {
  @Input() public names: string[];

  @Output() public save: EventEmitter<Planner> = new EventEmitter();

  public getFormControls(): Controls<Planner> {
    return {
      name: new FormControl(null, [Validators.required]),
      date: new FormControl(null, [Validators.required])
    }
  }

  public send(): void {
    this.save.emit(this.formGroupValues);
  }
}

Несколько замечаний:

  • Расширение компонента NgxSubFormComponent
  • Это типобезопасно, потому что мы передаем наш тип родительскому классу NgxSubFormComponent<Planner>
  • Мы определяем элементы управления формой, используя getFormControls, предоставленный NgxSubFormComponent, там же мы можем передать наши валидаторы

Вид формы:

planner-form.component.html

<code><form [formGroup]="formGroup" (ngSubmit)="send()">
  <select [formControlName]="formControlNames.name">
    <option value="">Select someone</option>
    <option *ngFor="let name of names" [value]="name">{{ name }}</option>
  </select>

  <input type="date" placeholder="Date" [formControlName]="formControlNames.date">

  <button type="submit" [disabled]="formGroup.invalid">Save</button>
</form>


<!-- debug -->
(CF console for output once the form is saved!)

<hr>

<p>Form value:</p>
<pre>{{ formGroupValues | json }}

Ошибки формы

{{ formGroupErrors | json }}

Примечания:

  • formGroup определяется библиотекой и просто дает вам доступ к ... группе форм!
  • formControlNames дает вам доступ ко всем именам элементов управления формы, но безопасным способом и при неправильном написаниипеременная машинописного имени заберет его (при компиляции с AOT)
  • formGroupValues дает вам доступ к значениям (конечный объект, который мы хотим отправить!)
  • formGroupErrors дает вам доступ к ошибкам, чтобы вы могли условно отображать сообщения, основанные на этом

Чтобы узнать больше о ngx-sub-форме, посетите страницу Github https://github.com/cloudnc/ngx-sub-form и прочтите Readme, всеследует правильно объяснить множеством примеров в папке /src!

Демонстрационная версия вашего примера: https://github.com/cloudnc/ngx-sub-form

Редактировать:

Если вы хотите пойти дальше, я только что опубликовал пост в блоге, чтобы объяснить много вещей о формах и ngx-sub-форме здесь https://dev.to/maxime1992/building-scalable-robust-and-type-safe-forms-with-angular-3nf9

...