子コンポーネントのAngularForm検証

Guido Neele

メインパーツ(widget.type)で選択されたタイプに基づいて、メインパーツとサブパーツが存在する動的フォームを作成しました。サブパーツの表示と非表示は、ngSwitchを使用して実行されます。

フォームのHTMLは次のようになります。

<form class="widget-form cc-form" (ngSubmit)="saveChanges()" novalidate>
  <div class="forms-group">
    <label for="title" i18n="@@title">Titel</label>
    <input class="form-control" id="title" name="title" type="text" [(ngModel)]="widget.title" required />
  </div>

  <div class="forms-group">
    <label class="checkbox-label" for="show" i18n>
      <input id="show" name="show" type="checkbox" [(ngModel)]="widget.show" /> <span>Titel tonen in app</span>
    </label>
  </div>

  <div class="forms-group">
    <label for="type" i18n="@@type">Type</label>
    <select class="form-control" id="type" name="type" [(ngModel)]="widget.type" required>
      <option value="text-widget" i18n="@@Text">Tekst</option>
      <option value="tasklist-widget" i18n="@@Tasklists">Takenlijst</option>      
      <option value="image-widget" i18n="@@Text">Afbeelding(en)</option>
      <option value="video-widget" i18n="@@Video">Youtube</option>
      <option value="link-widget" i18n="@@Link">Link</option>
      <option value="contacts-widget" i18n="@@Contacts">Contactpersonen</option>
      <option value="attachment-widget" i18n="@@Attachments">Bijlage(n)</option>
    </select>
  </div>

  <ng-container [ngSwitch]="widget.type">

    <text-widget *ngSwitchCase="'text-widget'" [data]="widget"></text-widget>

    <tasklist-widget *ngSwitchCase="'tasklist-widget'" [data]="widget"></tasklist-widget>

    <image-widget *ngSwitchCase="'image-widget'" [data]="widget"></image-widget>

    <video-widget *ngSwitchCase="'video-widget'" [data]="widget"></video-widget>

    <link-widget *ngSwitchCase="'link-widget'" [data]="widget"></link-widget>

    <contacts-widget *ngSwitchCase="'contacts-widget'" [data]="widget"></contacts-widget>

    <attachment-widget *ngSwitchCase="'attachment-widget'" [data]="widget"></attachment-widget>

  </ng-container>

</form>

すべてのウィジェットはそれ自身のコンポーネントです。

問題は、フォームの検証がメイン部分からの入力のみをチェックし、サブ部分(ウィジェットコンポーネント)を無視することです。ウィジェットからの入力フィールドが検証に含まれていることを確認するにはどうすればよいですか?

ウィジェットコンポーネントにisValid()メソッドを追加しようとしましたが、おそらくngSwitchで使用されているため、コンポーネントのインスタンスを取得できませんでした。@ ContentChild、@ ContentChildren、@ ViewChildなどはすべて未定義で返されました。

Guido Neele

ウィジェットが正しく入力されているかどうかを示すisValidメソッドを子コンポーネントに含めることにしました。フォームは、フォームとウィジェットコンポーネントの両方が有効な場合にのみ保存できます。

すべてのウィジェットコンポーネントは、変更されたEventEmitterプロパティとisValidメソッドを必要とするIWidgetComponentインターフェイスを実装します。子ウィジェットコンポーネントの1つは次のようになります。

@Component({
  selector: 'video-widget',
  templateUrl: './video.component.html',
  styleUrls: ['./video.component.css'],
  providers: [YouTubeIdExistsValidator]
})
export class VideoComponent implements OnInit, OnDestroy, IWidgetComponent {

  @Input("data")
  widget: IWidget;

  @Output("change")
  changed = new EventEmitter<any>();

  video: any;
  modelChanged: Subject<string> = new Subject<string>();

  public isValid(): boolean {
    return this.widget.youtube_id && this.widget.youtube_id !== "" && this.video ? true : false;
  }

  constructor(private youtubeService: YoutubeService) {
    this.modelChanged
      .debounceTime(500) // wait 500ms after the last event before emitting last event
      .distinctUntilChanged() // only emit if value is different from previous value
      .subscribe(youtube_id => this.getYoutubeVideo(youtube_id));
  }

  ngOnDestroy(): void {
    this.widget.youtube_id = "";
  }

  getYoutubeVideo(youtube_id: string) {
    this.youtubeService
      .getById(youtube_id)
      .subscribe((video) => {
        this.video = video;

        // Indicate that video was changed
        this.changed.emit();
      }, (error) => {
        this.video = null;
      });
  }

  youtubeIdChanged(youtube_id: string) {
    this.modelChanged.next(youtube_id);
  }

  ngOnInit() { }

}

親htmlは次のようになります。

<form #widgetForm novalidate>

...

<ng-container [ngSwitch]="widget.type">

      <text-widget #ref *ngSwitchCase="'text-widget'" [data]="widget" (change)="saveChanges()"></text-widget>

      <tasklist-widget #ref *ngSwitchCase="'tasklist-widget'" [data]="widget" (change)="saveChanges()"></tasklist-widget>

      <image-widget #ref *ngSwitchCase="'image-widget'" [data]="widget" (change)="saveChanges()"></image-widget>

      <video-widget #ref *ngSwitchCase="'video-widget'" [data]="widget" (change)="saveChanges()"></video-widget>

      <link-widget #ref *ngSwitchCase="'link-widget'" [data]="widget" (change)="saveChanges()"></link-widget>

      <contacts-widget #ref *ngSwitchCase="'contacts-widget'" [data]="widget" (change)="saveChanges()"></contacts-widget>

      <attachment-widget #ref *ngSwitchCase="'attachment-widget'" [data]="widget" (change)="saveChanges()"></attachment-widget>

</ng-container>

...

</form>

ウィジェットが変更されるたびに、親コンポーネントのフォームの保存メソッドをトリガーするイベントが発行されます(this.changed.emit())。この方法では、フォームとウィジェットが有効かどうかを確認します。有効な場合は、データを保存できます。

saveChanges() {

    if (this.ref && this.ref.isValid() && this.widgetForm.valid) {
      // save form

      this.toastr.success("Saved!");
    }
    else {
      this.toastr.warning("Form not saved!");
    }
  }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

子コンポーネントのリストのBlazor検証

分類Dev

子コンポーネントの検証Vuevee-validate

分類Dev

親コンポーネントと子コンポーネントのpropTypesを検証しますか?

分類Dev

レートコンポーネントant.designの検証

分類Dev

フォームを子コンポーネントに渡し、子コンポーネントのフォームを検証します

分類Dev

フォームを子コンポーネントに渡し、子コンポーネントのフォームを検証します

分類Dev

OrbeonXBLコンポーネントのデータの検証

分類Dev

複数のreactjsコンポーネントの検証

分類Dev

Vuelidateを使用して、親コンポーネントの子コンポーネントのフォーム入力フィールドを検証します

分類Dev

Symfony3構成コンポーネントの検証

分類Dev

親コンポーネントのAurelia火災検証

分類Dev

共有コンポーネントの検証

分類Dev

高次コンポーネントの型検証

分類Dev

自己検証formControlsとしてのAngularコンポーネント

分類Dev

ステッパーコンポーネントの子フォームの検証

分類Dev

親コンポーネントOnSubmitAngular 4から子コンポーネントの検証をトリガーする方法は?

分類Dev

Angular 2:親コンポーネントの子コンポーネントフォームフィールドを検証します

分類Dev

Angular4の親コンポーネントとは異なる3つのNgFormを持つ子コンポーネントNgFormsを検証する方法

分類Dev

MatDialogコンポーネント内でAngularFormが非常に遅いのはなぜですか?

分類Dev

Vee-子の日付ピッカーコンポーネントを検証します

分類Dev

コンポーネントからのAngular4パターンの検証

分類Dev

2つのprimefacesカレンダーコンポーネントの検証

分類Dev

子コンポーネントと検証を備えたAngular2ネストフォーム

分類Dev

子コンポーネントのFormControlName

分類Dev

Angular2ベータ:フォームベースの親/子コンポーネントをネストし、親から検証する

分類Dev

Angular2-子コンポーネントの入力フィールドのテンプレート駆動型フォーム検証

分類Dev

Vee-Validateを使用して、送信時に子入力コンポーネントを検証します

分類Dev

AngularForm正確な10文字の英数字パターンの検証

分類Dev

親コンポーネントの状態更新により、ReactJSでの子コンポーネントの再マウントが保証されますか?

Related 関連記事

  1. 1

    子コンポーネントのリストのBlazor検証

  2. 2

    子コンポーネントの検証Vuevee-validate

  3. 3

    親コンポーネントと子コンポーネントのpropTypesを検証しますか?

  4. 4

    レートコンポーネントant.designの検証

  5. 5

    フォームを子コンポーネントに渡し、子コンポーネントのフォームを検証します

  6. 6

    フォームを子コンポーネントに渡し、子コンポーネントのフォームを検証します

  7. 7

    OrbeonXBLコンポーネントのデータの検証

  8. 8

    複数のreactjsコンポーネントの検証

  9. 9

    Vuelidateを使用して、親コンポーネントの子コンポーネントのフォーム入力フィールドを検証します

  10. 10

    Symfony3構成コンポーネントの検証

  11. 11

    親コンポーネントのAurelia火災検証

  12. 12

    共有コンポーネントの検証

  13. 13

    高次コンポーネントの型検証

  14. 14

    自己検証formControlsとしてのAngularコンポーネント

  15. 15

    ステッパーコンポーネントの子フォームの検証

  16. 16

    親コンポーネントOnSubmitAngular 4から子コンポーネントの検証をトリガーする方法は?

  17. 17

    Angular 2:親コンポーネントの子コンポーネントフォームフィールドを検証します

  18. 18

    Angular4の親コンポーネントとは異なる3つのNgFormを持つ子コンポーネントNgFormsを検証する方法

  19. 19

    MatDialogコンポーネント内でAngularFormが非常に遅いのはなぜですか?

  20. 20

    Vee-子の日付ピッカーコンポーネントを検証します

  21. 21

    コンポーネントからのAngular4パターンの検証

  22. 22

    2つのprimefacesカレンダーコンポーネントの検証

  23. 23

    子コンポーネントと検証を備えたAngular2ネストフォーム

  24. 24

    子コンポーネントのFormControlName

  25. 25

    Angular2ベータ:フォームベースの親/子コンポーネントをネストし、親から検証する

  26. 26

    Angular2-子コンポーネントの入力フィールドのテンプレート駆動型フォーム検証

  27. 27

    Vee-Validateを使用して、送信時に子入力コンポーネントを検証します

  28. 28

    AngularForm正確な10文字の英数字パターンの検証

  29. 29

    親コンポーネントの状態更新により、ReactJSでの子コンポーネントの再マウントが保証されますか?

ホットタグ

アーカイブ