Angular2モーダルポップアップエラー「チェック後に式が変更されました」

ErnieKev

問題を示すYoutubeビデオ

デモアプリのGithubリポジトリ

アプリコンポーネント、子コンポーネント(アカウント)、メッセージダイアログコンポーネント(ポップアップモーダル)を処理するアラートサービスを備えた非常にシンプルなアプリがあります。

目的を示すために、app.component.ts内とaccount.component.ts内の2つの同一のフォームがあります。それぞれに、アラートサービスを呼び出してメッセージダイアログをモーダルで表示するボタンがあります。

問題は、子コンポーネント(account.component.ts)のフォームの入力フィールドをクリックして、「キーボードのEnterキーを押す」と、このエラーが発生することです。

例外:./ AccountComponentクラスAccountComponentのエラー-インラインテンプレート:2:2原因:式がチェックされた後に変更されました。以前の値: 'true'。現在の値: 'false'。このエラーは、以下に説明する他の状況では発生しないことに注意してください

  1. キーボードのEnterキーを押す代わりにボタンをクリックした場合

  2. Enterキーを押しても、app.componen.tsのフォームに問題はないようです。子コンポーネント(accouunt.component.ts)だけのようです。

  3. account.componentの入力をクリックし、何かを入力し、ボタンをクリックすると、エラーは表示されません。入力を削除し、Enterキーを押します。以前と比較して、エラーは表示されません。

私はSOとグーグルを調べましたが、人々は同じ問題を抱えており、変更検出を呼び出すことでそれを解決しているようです。しかし、それを試してみて、モーダルが表示された直後などに置いてみましたが、うまくいきませんでした。また、それで解決できる場合は、app.component.tsのフォームでこのエラーが発生しない理由が説明されていません。

以下はいくつかのコードスニペットです。完全なデモプロジェクトは上記のgithubリンクにあります。この問題は何日も私を悩ませてきました。助けてくれてありがとう。

app.component.html

<label>This form is from app.component.html</label>
<form name="form" [formGroup]="changePasswordForm" (ngSubmit)="onUpdatePassword()">
    <input placeholder="Old Password" formControlName="oldPassword">
    <button class="btn btn-success">Update Password</button>
</form>

<br><br><br><br>

<label>This form is from account.component.html</label>
<router-outlet> </router-outlet>

<template ngbModalContainer></template>

app.component.ts

export class AppComponent implements OnInit {

    private changePasswordForm: FormGroup;

    constructor(
      private formBuilder: FormBuilder,
      private alertService: AlertService,
    ) { }

    ngOnInit() {
      this.changePasswordForm = this.formBuilder.group({
        oldPassword: [''],
      })
    }

    onUpdatePassword() {
      this.alertService.alertPopup('test2', 'asfafa')
    }
}

account.component.html

<form name="form" [formGroup]="changePasswordForm" (ngSubmit)="onUpdatePassword()">
  <input placeholder="Old Password" formControlName="oldPassword">
  <button class="btn btn-success">Update Password</button>
</form>

account.component.ts

エクスポートクラスAccountComponentはOnInit {を実装します

  private changePasswordForm: FormGroup;

  constructor(
    private formBuilder: FormBuilder,
    private alertService: AlertService,
  ) { }

  ngOnInit() {
    this.changePasswordForm = this.formBuilder.group({
      oldPassword: [''],
    })
  }

  onUpdatePassword() {
    this.alertService.alertPopup('test2', 'asfafa')
  }
}

alert.service.ts

@Injectable()
export class AlertService {
    private subject = new Subject<any>();
    private keepAfterNavigationChange = false;

    constructor(
        private router: Router,
        private modalService: NgbModal,
    ) { }


    alertPopup(title: string, content: string) {
        // open modal to check if worked over night
        const modalRef = this.modalService.open(MessageDialogComponent);

        modalRef.componentInstance.titleText = title
        modalRef.componentInstance.bodyText = content

        modalRef.result
            .then(response => {
            })
            .catch(() => {
                return
            })
    }
}

メッセージ-dialog.component.html

<div class="modal-header">
  <h4 class="modal-title">{{titleText}}</h4>
</div>

<div class="modal-body">
  <p>{{bodyText}}</p>
</div>

メッセージ-dialog.component.ts

export class MessageDialogComponent implements OnInit {

  @Input() titleText: string;
  @Input() bodyText: string;

  constructor(
    public activeModal: NgbActiveModal,
  ) { }

  ngOnInit() {
  }

}

スクリーンショット

ゆるずい

次のコードの実行後にエラーが発生したようです。

ngAfterViewInit() {
    if (!this._elRef.nativeElement.contains(document.activeElement)) {
      this._renderer.invokeElementMethod(this._elRef.nativeElement, 'focus', []);
    }
}

https://github.com/ng-bootstrap/ng-bootstrap/blob/1.0.0-alpha.20/src/modal/modal-window.ts#L65

oninputblur、コントロールをとしてマークする発生イベントですtouched

それはのための作業をしないAccountComponentで検出が変わるので、AccountComponent前に発生しngbModalContainerている間FormGroup内にapp.component.html正しい値を取得します。

可能な解決策:

1)モーダルを開く前に、コントロールにタッチ済みのマークを付けます

account.component.ts

onUpdatePassword() {
  Object.keys(this.changePasswordForm.controls).forEach(key => {
     this.changePasswordForm.controls[key].markAsTouched();
  });

  this.alertService.alertPopup('test2', 'asfafa')
}

2)注文変更タグ

app.component.html

<template ngbModalContainer></template>
<router-outlet> </router-outlet>

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Angular2モーダルポップアップエラー「チェック後に式が変更されました」

分類Dev

チェック後にエラー値が変更されました(Angular2のステートフルパイプ)

分類Dev

Angular2「チェック後に式が変更されました」

分類Dev

エラーエラー:ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました。Angular

分類Dev

チェックされた後にAngular4式が変更されましたエラー

分類Dev

'...チェック後に変更された' devエラーを引き起こすAngular2パイプ

分類Dev

コンポーネント内でモーダルポップアップを開く際の式のエラーが変更されました

分類Dev

Angular4-NG-IFの使用中に「チェック後に式が変更されました」エラー

分類Dev

「ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました」Angularのエラー

分類Dev

Angular2変更検出「チェック後に式が変更されました」

分類Dev

Angular2:ネストされた* ngForの結果、「チェック後に式が変更されました」

分類Dev

Ionic 2レンジスライダーにより、「チェック後に式の値が変更されました」エラーが発生する

分類Dev

Angular2メソッドバインディングエラー:「チェック後に値が変更されました」

分類Dev

コンポーネントプロパティが現在の日時に依存している場合に、Angular2の「式はチェック後に変更されました」という例外を管理する方法

分類Dev

Angular2rc6式がチェック後に変更されました

分類Dev

Angular2-チェック後に式が変更されました

分類Dev

「式がチェックされた後に変更されました」をトリガーせずに、Angular2で入力検証のためにngOnChangesを実装する方法。エラー

分類Dev

Angular2-双方向バインディングのエラー:チェック後に式が変更されました

分類Dev

角度2のマップキーによって反復中にチェックされた後、式が変更されました

分類Dev

フォーム値の更新でAngular2(beta3)「チェック後に式が変更されました」

分類Dev

チェックされた後、MatExpansionPanel式が変更されましたエラー 'mat-expanded:true'

分類Dev

「ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました」に直面してローダーを表示/非表示

分類Dev

Angular8-チェック後に式が変更されました

分類Dev

Angular ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました。cdkdrag

分類Dev

Angular-チェック後に式が変更されました。以前の値

分類Dev

モーダルポップアップの背景がフェードインし、ポップアップを閉じた後も表示されます

分類Dev

ブートストラップナビゲーションバーのサイズを小さなブラウジングエリアに変更した後、モーダルの入力フォームが下部にドロップされました

分類Dev

ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました-監視可能な値の変更後にテンプレートを更新する方法

分類Dev

Git / GitKraken –バックアップからリポジトリを復元した後、ファイルモードが不明な値(14001)に変更されます

Related 関連記事

  1. 1

    Angular2モーダルポップアップエラー「チェック後に式が変更されました」

  2. 2

    チェック後にエラー値が変更されました(Angular2のステートフルパイプ)

  3. 3

    Angular2「チェック後に式が変更されました」

  4. 4

    エラーエラー:ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました。Angular

  5. 5

    チェックされた後にAngular4式が変更されましたエラー

  6. 6

    '...チェック後に変更された' devエラーを引き起こすAngular2パイプ

  7. 7

    コンポーネント内でモーダルポップアップを開く際の式のエラーが変更されました

  8. 8

    Angular4-NG-IFの使用中に「チェック後に式が変更されました」エラー

  9. 9

    「ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました」Angularのエラー

  10. 10

    Angular2変更検出「チェック後に式が変更されました」

  11. 11

    Angular2:ネストされた* ngForの結果、「チェック後に式が変更されました」

  12. 12

    Ionic 2レンジスライダーにより、「チェック後に式の値が変更されました」エラーが発生する

  13. 13

    Angular2メソッドバインディングエラー:「チェック後に値が変更されました」

  14. 14

    コンポーネントプロパティが現在の日時に依存している場合に、Angular2の「式はチェック後に変更されました」という例外を管理する方法

  15. 15

    Angular2rc6式がチェック後に変更されました

  16. 16

    Angular2-チェック後に式が変更されました

  17. 17

    「式がチェックされた後に変更されました」をトリガーせずに、Angular2で入力検証のためにngOnChangesを実装する方法。エラー

  18. 18

    Angular2-双方向バインディングのエラー:チェック後に式が変更されました

  19. 19

    角度2のマップキーによって反復中にチェックされた後、式が変更されました

  20. 20

    フォーム値の更新でAngular2(beta3)「チェック後に式が変更されました」

  21. 21

    チェックされた後、MatExpansionPanel式が変更されましたエラー 'mat-expanded:true'

  22. 22

    「ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました」に直面してローダーを表示/非表示

  23. 23

    Angular8-チェック後に式が変更されました

  24. 24

    Angular ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました。cdkdrag

  25. 25

    Angular-チェック後に式が変更されました。以前の値

  26. 26

    モーダルポップアップの背景がフェードインし、ポップアップを閉じた後も表示されます

  27. 27

    ブートストラップナビゲーションバーのサイズを小さなブラウジングエリアに変更した後、モーダルの入力フォームが下部にドロップされました

  28. 28

    ExpressionChangedAfterItHasBeenCheckedError:チェック後に式が変更されました-監視可能な値の変更後にテンプレートを更新する方法

  29. 29

    Git / GitKraken –バックアップからリポジトリを復元した後、ファイルモードが不明な値(14001)に変更されます

ホットタグ

アーカイブ