オブジェクトの詳細を変更するフォームを表すコンポーネントを作成しました。オブジェクトがapp.component.ts
に存在する:テキストエリアで[(ngModel)]バインディングを使用するとExpressionChangedAfterItHasBeenCheckedErrorを回避する方法
export class AppComponent {
selectedItem: Item;
}
それは双方向そうようapp.component.html
からコンポーネントへの結合を介して渡される:コンポーネント内
<item-details [(item)]="selectedItem"></item-details>
、Item
の個々のフィールドは、に結合していますユーザーがデータを更新できるようにするための入力コントロール。例:
<mat-form-field class=name>
<input matInput [(ngModel)]="item.name" value="{{item.name}}" required placeholder="Name">
<mat-error>Item name can not be left blank</mat-error>
</mat-form-field>
テキストが表示されるまですべてが機能しますREA:
<mat-form-field class="full-width">
<textarea id=description matInput [(ngModel)]="item.description" placeholder="Description">{{item.description}}</textarea>
</mat-form-field>
それは動作しますが、それは例外をスロー:それは価値がfalse
からtrue
に行って、このような表示されることを言うように、
ExpressionChangedAfterItHasBeenCheckedError
エラーが直接<textarea>
に縛られていませんフォーム上のvalid
プロパティに関連しており、ヒント:hereです。
興味深いことに、私は、このような内容の後にスペースを入れることでなど<textarea></textarea>
の内容を変更することでエラーを回避することができます
<textarea ...>{{item.description}} </textarea>
しかしitem.description
がnull
でない場合にのみ動作すること。 null
の場合、エラーが再び表示されます。
selectedItem
に双方向バインディングを持つ別の子コンポーネントからselectedItem
への変更をトリガーしています。ユーザーが項目を選択すると、新しいItem
がアプリまで流れて、詳細コンポーネントに戻ります。
私はEverything you need to know about the 'ExpressionChangedAfterItHasBeenCheckedError' errorの記事を読んでいます。記事を引用するために、 "私はそれらを使用することをお勧めしませんが、むしろあなたのアプリケーションを再設計する"。
素晴らしい!どうやって?コントロールAを使用してItem
を選択し、コントロールBを使用してそのコントロールを編集するにはどうすればよいのですか?コントロールAとBがこのエラーを引き起こさずに互いに話す正しい方法は何ですか?
無限ループを作成しているので、入力からvalue = "{{item.name}}"を削除します。 ngModelで十分です – Mehdi