注意すべきことの1つは、ngOptionsが機能するにはngModelが必要であるということです... ng-model="blah"
「$scope.blahを選択した値に設定する」と言っていることに注意してください。
これを試して:
<select ng-model="blah" ng-options="item.ID as item.Title for item in items"></select>
AngularJS のドキュメントの詳細を次に示します (まだ見ていない場合)。
配列データ ソースの場合:
- 配列内の値のラベル
- 配列の値のラベルとして選択
- 配列の値のグループごとにラベルを付ける = 配列の値のグループごとのラベルとして選択
オブジェクト データ ソースの場合:
- オブジェクトの (key , value) のラベル
- オブジェクトの (key , value) のラベルとして選択
- オブジェクト内の (キー、値) のグループごとにラベルを付ける
- オブジェクト内の (キー、値) のグループごとにラベル グループとして選択
AngularJS のオプション タグの値を明確にするために:
を使用するng-options
と、ng-options によって書き出されるオプション タグの値は、常にオプション タグが関連する配列項目のインデックスになります。これは、AngularJS では、プリミティブ型だけでなく、選択コントロールを使用してオブジェクト全体を実際に選択できるためです。例えば:
app.controller('MainCtrl', function($scope) {
$scope.items = [
{ id: 1, name: 'foo' },
{ id: 2, name: 'bar' },
{ id: 3, name: 'blah' }
];
});
<div ng-controller="MainCtrl">
<select ng-model="selectedItem" ng-options="item as item.name for item in items"></select>
<pre>{{selectedItem | json}}</pre>
</div>
上記により、オブジェクト全体を$scope.selectedItem
直接選択できます。ポイントは、AngularJS を使用すると、オプション タグの内容を気にする必要がないということです。AngularJS に処理させます。スコープ内のモデルにあるものだけを気にする必要があります。
上記の動作を示し、HTML が書き出された plunker を次に示します。
デフォルトのオプションを扱う:
デフォルトのオプションに関して、上記で言及しなかったことがいくつかあります。
最初のオプションを選択し、空のオプションを削除します。
ng-init
これを行うには、モデル ( からng-model
) を で繰り返す項目の最初の要素に設定する単純なものを追加しng-options
ます。
<select ng-init="foo = foo || items[0]" ng-model="foo" ng-options="item as item.name for item in items"></select>
foo
注:たまたま「偽物」に適切に初期化された場合、これは少しおかしくなる可能性があります。その場合、foo
ほとんどの場合、コントローラーでの初期化を処理する必要があります。
デフォルト オプションのカスタマイズ:
これは少し異なります。ここで行う必要があるのは、select の子としてオプション タグを追加し、値属性を空にして、その内部テキストをカスタマイズすることだけです。
<select ng-model="foo" ng-options="item as item.name for item in items">
<option value="">Nothing selected</option>
</select>
注: この場合、別のオプションを選択した後でも、「空の」オプションはそこに残ります。これは、AngularJS での選択のデフォルトの動作には当てはまりません。
選択後に非表示になるカスタマイズされたデフォルト オプション:
値を選択した後にカスタマイズしたデフォルト オプションを削除したい場合は、デフォルト オプションに ng-hide 属性を追加できます。
<select ng-model="foo" ng-options="item as item.name for item in items">
<option value="" ng-if="foo">Select something to remove me.</option>
</select>