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。

完整的例子

所有 <select>ng-options 必須連線 ng-model