ngOptions
ngOptions
是一個指令,它簡化了 html 下拉框的建立,以便從將儲存在模型中的陣列中選擇專案。ngOptions 屬性用於使用通過評估 ngOptions 理解表示式獲得的陣列或物件動態生成 <select>
元素的 <option>
元素列表。
使用 ng-options
,標記可以簡化為一個選擇標記,指令將建立相同的選擇:
<select ng-model="selectedFruitNgOptions"
ng-options="curFruit as curFruit.label for curFruit in fruit">
</select>
有使用 ng-repeat
建立 select
選項的另一種方法,但不推薦使用 ng-repeat
,因為它主要用於通用目的,例如,forEach
只是為了迴圈。而 ng-options
專門用於建立 select
標籤選項。
上面使用 ng-repeat
的例子是
<select ng-model="selectedFruit">
<option ng-repeat="curFruit in fruit" value="{{curFruit}}">
{{curFruit.label}}
</option>
</select>
讓我們詳細看一下上面的例子,裡面還有一些變化。
示例的資料模型:
$scope.fruit = [
{ label: "Apples", value: 4, id: 2 },
{ label: "Oranges", value: 2, id: 1 },
{ label: "Limes", value: 4, id: 4 },
{ label: "Lemons", value: 5, id: 3 }
];
<!-- label for value in array -->
<select ng-options="f.label for f in fruit" ng-model="selectedFruit"></select>
選擇時生成的選項標籤:
<option value="{ label: "Apples", value: 4, id: 2 }"> Apples </option>
功效:
f.label
將是 <option>
的標籤,該值將包含整個物件。
<!-- select as label for value in array -->
<select ng-options="f.value as f.label for f in fruit" ng-model="selectedFruit"></select>
選擇時生成的選項標籤:
<option value="4"> Apples </option>
功效:
f.value(4)
將是這種情況下的值,而標籤仍然是相同的。
<!-- label group by group for value in array -->
<select ng-options="f.label group by f.value for f in fruit" ng-model="selectedFruit"></select>
選擇時生成的選項標籤:
<option value="{ label: "Apples", value: 4, id: 2 }"> Apples </option>
功效:
選項將根據 value
進行分組。具有相同 value
的選項將屬於一個類別
<!-- label disable when disable for value in array -->
<select ng-options="f.label disable when f.value == 4 for f in fruit" ng-model="selectedFruit"></select>
選擇時生成的選項標籤:
<option disabled="" value="{ label: "Apples", value: 4, id: 2 }"> Apples </option>
功效:
由於條件 disable when f.value==4
,蘋果和酸橙將被禁用(無法選擇)。value=4
的所有選項均應禁用
<!-- label group by group for value in array track by trackexpr -->
<select ng-options="f.value as f.label group by f.value for f in fruit track by f.id" ng-model="selectedFruit"></select>
選擇時生成的選項標籤:
<option value="4"> Apples </option>
功效:
使用 trackBy
時沒有視覺上的變化,但 Angular 會通過 id
而不是參考來檢測變化,而這最常見的是更好的解決方案。
<!-- label for value in array | orderBy:orderexpr track by trackexpr -->
<select ng-options="f.label for f in fruit | orderBy:'id' track by f.id" ng-model="selectedFruit"></select>
選擇時生成的選項標籤:
<option disabled="" value="{ label: "Apples", value: 4, id: 2 }"> Apples </option>
功效:
orderBy
是一個 AngularJS 標準過濾器,它按升序排列選項(預設情況下),因此其中的 Oranges
將顯示為 1st,因為它的 id
= 1。