[AngularJS] 下拉式選單 ng-options 操作說明

下拉式選單 ng-options 操作說明

使用介紹

典型使用方式如下圖所示,下拉式選單一定會有陣列型態選項資料來源(ctrl.actions),其中action表示陣列中物件的別稱,類似C#語法中foreach中所使用的變數,可隨意命名無妨。接著action.value表示要顯示在選項中的文字,我們是可以自行加入文字以符合需求(ex. '動作-' + action.value);最後action.key表示選單所對應的內容值,而這裡所設定的值將會Binding至ng-model中,因此可以依需求來調整轉換選單內容值型態。

ng-options=' 選項內容值 as 選項顯示文字 for 單筆資料別稱 in 選項陣列資料 '

image

 

環境

* AngularJS v1.4.6

 

重點提示

1. 給予預設值時,Angularjs是使用 === 來比較對應之選項內容值,所以須注意型態是否相符。

2. Html中每個select option的value不會是選項內容值,而是angularjs中定義的陣列索引(Index)資訊。

 

實際演練

要了解使用方式及型態相關問題,最快的方式就是給予初始值,當初始值型態內容與ng-options設定內容值型態條件不符合時,選項是不會如你預期呈現的,也因如此可以直接了當發現自己的錯誤;所以當我們在設定選單初始值時,需考慮陣列資料提供做為選項內容值型態為何,是否與給予初始值之型態一致。以下將以相同選項資料源(vm.actions)進行測試,我們可以使用不同資料型態(vm.currentAction1, vm.currentAction2, vm.currentAction3) 搭配對應 ng-options 設定初始值,並且正確綁定所需資料至ng-model中。以下說明。

image

測試Javascript代碼如下


angular
    .module('app', []);

angular
    .module('app')
    .controller("MyController", function(){
  
    var vm = this;
  
    // method
    vm.toInt = function(id){
      return parseInt(id, 10);
    };
    vm.getType = function(obj){
      return typeof obj;
    };
  
  
    // options
    vm.actions = [{key:"1",value:"sleep"},
                  {key:"2",value:"play"}];    
    
  
    // set default select value
    vm.currentAction1 = "1";
    vm.currentAction2 = vm.actions[0];
    vm.currentAction3 = 1;   
  
  });


 

測試Html代碼如下


<!DOCTYPE html>
<html ng-app="app">
<head>
<meta name="description" content="ng-options sample">
  <meta charset="utf-8"> 
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.6/angular.js"></script>


</head>
<body>
  
  <form ng-controller="MyController as ctrl">
    

    <!-- selected value as key(str)-->
    <select ng-model="ctrl.currentAction1" 
            ng-options="a.key as a.value for a in ctrl.actions">
      <option value="">Please Select</option>
    </select>
    
    <br>
    currentAction1: {{ctrl.currentAction1}} ({{ctrl.getType(ctrl.currentAction1)}})
    
    
    <br>
    <br>
    <!-- selected value as object -->
    <select ng-model="ctrl.currentAction2" 
            ng-options=" a.value for a in ctrl.actions">
      <option value="">Please Select</option>
    </select>
    
    <br>
    currentAction2: {{ctrl.currentAction2}} ({{ctrl.getType(ctrl.currentAction2)}})
    
    
    <br>
    <br>
    <!-- selected value as key(int)-->
    <select ng-model="ctrl.currentAction3" 
            ng-options="ctrl.toInt(a.key) as a.value for a in ctrl.actions">
      <option value="">Please Select</option>
    </select>
    
    <br>
    currentAction3: {{ctrl.currentAction3}} ({{ctrl.getType(ctrl.currentAction3)}})
  </form>
  
</body>
</html>

 

分段來研究一下。首先由於預設值是相同型態(string),所以不需要特別處理就可以達成目標。

image

如需以物件(object)作為初始值,此時ng-options就不特別指定選項內容值,預設將以物件作為選項內容值。

image

如果數值型態不同(number, string)時,需要轉換(ctrl.toInt)才可以正確設定選項初始值。

image

 

參考資訊

http://blog.miniasp.com/post/2013/05/12/AngularJS-ng-module-select-ngOptions-usage-samples.aspx


希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !