3

私はAngular 1.3.0rc2を使用しており、ユーザーが入力したかのように入力フィールドをぼかして、別の入力フィールドを設定しようとしています。

設定しようとしている入力に同期バリデーターのみが存在し、デバウンスまたは非同期バリデーターが存在しない場合、次のようなことをすると、常に期待どおりに機能するように見えます。

myForm.username.$setViewValue('some value');
myForm.username.$render();

ただし、設定しようとしている入力に非同期バリデータまたはデバウンスが存在し、設定しようとしている入力が現在無効な状態にある場合、期待どおりに動作しないようです。

私は自分の問題を示すために次の plunkr を作成しました。「フルネーム」の値を設定してみて、フルネームフィールドのぼかしにも設定したいユーザー名フィールドで何が起こるかを確認してください。ユーザー名フィールドが無効な状態の場合、氏名の値を変更してからフィールドからフォーカスを削除しても、期待どおりにユーザー名が更新されません。

http://plnkr.co/edit/h1hvf79W8ovqAlNLpBvS

それで、私の質問は、ある入力フィールドを別の入力フィールドから確実に機能させ、ユーザー自身がこの新しい入力を入力したかのように動作するように設定するにはどうすればよいですか (したがって、バリデーターを実行し、それに応じてモデル値を更新します)。

4

2 に答える 2

0

ここで解決したい基本的な問題は、無効であることが判明した入力をユーザーが設定すると、基になるモデル値が未定義に設定されるのに対し、プログラムで入力を無効な状態に設定しても、そうではないということです。

これは矛盾していたので、それを回避する方法を見つけようとしていました。解決策は期待したほど単純ではないことが判明しました ( https://github.com/angular/angular.js/issues/9295を参照) 。

ただし、代わりに逆の解決策が提案されました。これはngModelOptions、「allowInvalid」をtrueに設定して、囲んでいるフォームで(または入力ごとに)使用することを含みます。これは、その場合にモデル値がクリアされるのではなく、無効な値が引き続きモデルに設定されることを意味します。

有効性に関係なくモデルが常に設定されていることを考えると、あるフィールドを別のフィールドにプログラムで設定するより単純な手段に戻ることができます - 単純に基礎となるモデル値を設定し、ユーザーが自分で値を設定した場合と同じように動作します:)

2 番目の入力で非同期バリデーターを使用した plunkr のデモ:

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

必要に応じて、有効性と非同期バリデータの訴えに関係なく、2番目の入力値が手動で設定されているか、最初の入力から設定されているかに関係なく、モデルがどのように同じになるかを確認してください:)

于 2014-09-26T23:07:09.777 に答える