angularjs入門-ng-options

angularjs入門-ng-options

這個主要是針對下拉式清單的部份,操作起來也算是比較複雜難記的,其實寫下來除了可以讓入門的人參考,也是可以方便自己來查看,我先來設計一個台灣六都的陣列,然後呈現在下拉式選單裡面,在下拉選單裡面則呈現選擇了哪個值,範例如下

 

image


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body ng-app="App">
    <div ng-controller="FirstCtrl">
        <select ng-model="selectValue" class="form-control" ng-options="city for city in taiwan">
            <option value="">請選擇</option>
        </select>
        {{selectValue}}
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                $scope.taiwan = ['台北','桃園','新竹','台中','台南','高雄'];
            });
    </script>
</body>
</html>

針對這個語法特別解釋一下,ng-options就是我們要呈現在畫面中的樣子,如果呈現都是在ng-options裡面去操作,taiwan就是陣列的名稱,for city的這個city則是取出的每一個值,第一個city則是要顯示的文字,如果我們今天想呈現的是陣列裡面的位置,我們可以把程式改成如下

 

image


        <select ng-model="selectValue" class="form-control" ng-options="key as city for (key,city) in taiwan">
            <option value="">請選擇</option>
        </select>
        {{selectValue}}
</div>

key值是{{selectValue}}的值,as city則是下拉選單中要顯示的值,for(key,city)的部份,也就是說key是陣列的位置,city則是要顯示的六都名稱,如果我們想要顯示的也是陣列位置的值,可以改成如下

 


        <select ng-model="selectValue" class="form-control" ng-options="key as key for (key,city) in taiwan">
            <option value="">請選擇</option>
        </select>
        {{selectValue}}
</div>

我有說過如果我們想格式化顯示的值,也是在ng-options裡面去實做,如下範例

 

image


            <option value="">請選擇</option>
 </select>

在來我們把問題複雜化一點,假設我們後端來的是一個json的值,除了六都還有各都的區,在這邊我只是假設,所有都市只有東西南北區,下面是範例

 

image


    <div ng-controller="FirstCtrl">
        <select ng-model="selectValue" class="form-control" ng-options="city.city for city in taiwan">
            <option value="">請選擇</option>
        </select>
        {{selectValue}}
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                $scope.taiwan = [
                    { city: '台北', area: '東區' },
                    { city: '台北', area: '西區' },
                    { city: '台北', area: '南區' },
                    { city: '台北', area: '北區' },
                    { city: '桃園', area: '東區' },
                    { city: '桃園', area: '西區' },
                    { city: '桃園', area: '南區' },
                    { city: '桃園', area: '北區' },
                    { city: '新竹', area: '東區' },
                    { city: '新竹', area: '西區' },
                    { city: '新竹', area: '南區' },
                    { city: '新竹', area: '北區' },
                    { city: '台中', area: '東區' },
                    { city: '台中', area: '西區' },
                    { city: '台中', area: '南區' },
                    { city: '台中', area: '北區' },
                    { city: '台南', area: '東區' },
                    { city: '台南', area: '西區' },
                    { city: '台南', area: '南區' },
                    { city: '台南', area: '北區' },
                    { city: '高雄', area: '東區' },
                    { city: '高雄', area: '西區' },
                    { city: '高雄', area: '南區' },
                    { city: '高雄', area: '北區' }
                ];
            });
    </script>
</body>

我們可以看到這是不合理的,因為我們應該只能顯示台北然後底下是各自的區域,這時候我們需要用到group來顯示,如下圖所示

 

image

image


        <select ng-model="selectValue" class="form-control" ng-options="city.area group by city.city for city in taiwan">
            <option value="">請選擇</option>
        </select>
        {{selectValue}}
</div>

但是為何我們選擇了選項之後,顯示的卻是類似json的value,那是因為我們的ng-model取到的是你選擇到哪一列的值,如果我們想要顯示的是台北東區的話,那我們就得把expression改成如下


        <select ng-model="selectValue" class="form-control" ng-options="city.area group by city.city for city in taiwan">
            <option value="">請選擇</option>
        </select>
        {{selectValue.city}}{{selectValue.area}}
    </div>

image

 

以上再請大家多多指教