3

$scope.$watch ステートメント内から ng-options を設定すると、問題が発生します。

以下の作品: <select ... ng-options="x.val as x.id for x in options"></select>

しかし、これはしません: <select ... ng-options="x.val as x.val for x in options"></select>

Plunker に問題が表示されます -- [更新オプション] をクリックします

モデルの値がオプションの前に設定され、ラベルと値が等しい場合、モデルは使用可能なオプションと一致しません。

これはバグですか、それとも何か間違っていますか?

サンプル コントローラ コード:

$scope.myModel = 'Two';
$scope.$watch('loadTrigger', function(newValue, oldValue) {

    if (newValue == oldValue) { return; }

    $scope.options = [{id: 1, text: 'One'}, {id: 2, text: 'Two'}...];
})

サンプル ビュー:

<select ng-model="myModel" ng-options="x.text as x.text for x in options">...</select>

監視がトリガーされ、オプションが更新されると、選択すると、予想される「2」ではなく、空白またはデフォルトのオプションが表示されます。ただし、ラベルと値が (わずかでも) 異なる場合、すべてが期待どおりに機能します

4

1 に答える 1

0

これは、Angular が選択されたオプションをバインドされたモデルに関連付ける方法の (私にとって) あいまいな領域の 1 つです。

要するに、追加するtrack by(および を使用しないselect as) と、これが解決されます。

<select ng-model="textLabel" 
        ng-options="x.text for x in dynamicOptions track by x.text">
   <option value="">[No Value]</option>
</select>

編集: 少し前に、Angular の github でこの問題track byが議論されているのを見つけました。1.2.x Angular で機能しないアプローチ -> したがって、暗い部分

于 2015-01-15T19:21:09.617 に答える