Angular.js: Angular1.6は誤って `をリセットします<select>の `ng-model`値</select>

作成日 2017年01月20日  ·  3コメント  ·  ソース: angular/angular.js

:サポートに関する質問については、 httpsください。

機能をリクエストしバグを報告しますか?
バグ

現在の動作は何ですか?
Angular 1.6は、 <option>のリストが変更されると、 <select> s ng-model値をリセットします(「その他の情報」セクションを参照)。
Angular1.5はそれを保持します。

現在の動作がバグである場合は、再現する手順を提供し、可能であればhttps://plnkr.coまたは同様の方法で問題の最小限のデモを提供して
Angular 1.6: https
Angular 1.5.11: https ://plnkr.co/edit/e0LVMEtGP2j4JxNf8lsp?p = preview

期待される動作は何ですか?
ng-modelはその価値を保持します。

行動を変える動機/ユースケースは何ですか?
正しくありません。

この問題の影響を受けるAngularのバージョンとブラウザ/ OSはどれですか? また、最新の安定版とスナップショット(https://code.angularjs.org/snapshot/)バージョンでテストしてください。
Angular1.6.xが影響を受けます。
Angular1.5.xはそうではありません。

その他の情報(例:スタックトレース、関連する問題、修正方法の提案)
重要なのは、Angular 1.6は、 optionsの値ではなく、モデルによってオプションを追跡することです。

上記のスニペットでは、options配列に2つのオブジェクトが含まれています: [{val: "1"}, {val: "2"}]
ng-repeatはそれらを繰り返し処理し、オプション値とタイトルの両方としてvalプロパティを使用します。
vm.selectedはselectのng-model値として使用され、最初は「2」に設定されています。

押した後Change optionsボタンを私はこの1つにオプションの配列を置き換える: [{val: "2"}, {val: "3"}]と角1.6リセットvm.selected値ではなく、オプションの値を持つので2ありますまだリストにあります。

この場合、Angular 1.5は正しく動作し、 vm.selected値が保持されます。

vm.optionsにプリミティブ値が含まれている場合、バグは表示されません(スニペット)。

forms low investigation regression bug

最も参考になるコメント

これはhttps://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84の意図的な変更であるようです: "-現在選択されているオプションが削除されるか、その値が変更されると、モデルはnullに設定されます。 「」 しかし、これはこれが壊れている可能性があること、またはngRepeatがオプションを更新するためにダイジェストを取得することを考慮していませんでした。 要素の作成/破棄を制御するため、ngOptionsでも簡単に実行できます。
しかし、scheduleRender()は機能します、 @ gkalpakに賛成です! テストに失敗するかどうかを確認し、PRを準備します。

全てのコメント3件

有効な問題のようで、1.6.0-rc.0で壊れます。 以前に発生しなかった理由はわかりませんが、問題は次のようです。

  1. 配列が変更されると、 ngRepeatは前の<option>要素を削除します。
  2. これにより、 <select>が選択解除され、 ngModelがnullに設定されます。
  3. 新しいアイテムはngRepeatによって作成および挿入されますが、modelValueは2はなくなったため、 <select>は新しい<option value="2" ...>に関連付ける方法がありません。

回避策は、 track byを使用して、 <option>要素の破棄と再作成を回避することです。

<option ng-repeat="option in options track by option.val" value="option.val">...

簡単に見ると、次のコミットがこれを引き起こした候補です(ただし、他の何かである可能性があります)。

  • f02b707
  • 47c15fb
  • 2785ad7

頭のてっぺんから、この行scheduleRender()置き換えることから始めて、それが役立つかどうかを確認します...

@Narretzにはもっと良い洞察があると確信しています:smiley:

回避策は、トラックバイを使用して、

はい、それも見つけましたが、言及するのを忘れました😏

これはhttps://github.com/angular/angular.js/commit/47c15fbcc10f118170813021e8e605ffd263ad84の意図的な変更であるようです: "-現在選択されているオプションが削除されるか、その値が変更されると、モデルはnullに設定されます。 「」 しかし、これはこれが壊れている可能性があること、またはngRepeatがオプションを更新するためにダイジェストを取得することを考慮していませんでした。 要素の作成/破棄を制御するため、ngOptionsでも簡単に実行できます。
しかし、scheduleRender()は機能します、 @ gkalpakに賛成です! テストに失敗するかどうかを確認し、PRを準備します。

このページは役に立ちましたか?
0 / 5 - 0 評価