下拉列表选项 ng-options

在学习了ng-repeat过后,我们其实已经可以用循环的方式实现下拉列表的选项。但是,AngularJS提供了ng-options的方法,让我们能够更轻松的完成这项工作。

官网提供了一个详尽的示例进行演示(点击打开后滑动到页面最下部进行效果测试),本节中的内容,是将官网的内容进行梳理后进行的讲解。

ng-options提供了很多功能用来梳理或筛选下拉列表的选项。我们将分别学习它们。

首先,让我们学习下如何使用ng-options。这里,我们期望实现的是,使用下拉列表,让页面上的一个方块的颜色对应变化:

我们首先配置一个颜色的列表,并且在$scope中存储一个用于保存选中状态的变量,将它的默认值设置为颜色列表的第一个:

  1. App.controller("FirstCtrl", function ($scope) {
  2. $scope.colors = [
  3. {name: '黑色', color:'black' },
  4. {name: '白色', color:'white' },
  5. {name: '红色', color:'red' },
  6. {name: '蓝色', color:'blue' },
  7. {name: '黄色', color:'yellow'}
  8. ];
  9. //保存选中的状态,默认颜色设置为黑色
  10. $scope.colorChosen = $scope.colors[0];
  11. });
  1. <div ng-controller="FirstCtrl">
  2. <label>选择一个颜色(无空选项):
  3. <select ng-model="colorChosen" ng-options="color.name for color in colors">
  4. </select>
  5. </label>
  6. <br>
  7. 当前选中的颜色: {{ colorChosen.name }}
  8. <div style="border:solid 1px black; height:20px"
  9. ng-style="{'background-color':colorChosen.color}">
  10. </div>
  11. </div>

运行页面,我们可以看到下拉列表中有列表中的五种颜色,并且选中不同颜色后,下方方框内的颜色,会根据选择变化。

图4-18 ng-options运行效果

颜色根据选中状态变化,利用到了ng-modelng-style的特性。下面,我们将仔细讲解ng-options中的语法:

  • color.name

    • 用于显示在下拉框中的名称
  • for color in colors

    • 类似于ng-repeat中的用法,将colors遍历,每次遍历的对象命名为color

增加未选中的选项

在很多时候,我们期望能有一个没选中的选项。我们可以通过手动的方式添加这个选项:

  1. <select ng-model="colorChosen" ng-options="color.name for color in colors">
  2. <option value="">-- 选择一个颜色 --</option>
  3. </select>

图4-19 ng-options加上空选项

按组排列group by

ng-options也支持按组排列数据,使用group by语法,下面我们看看例子:

首先,我们在列表中增加类型字段:

  1. $scope.colors = [
  2. {name: '黑色', color: 'black', type: "暗色"},
  3. {name: '白色', color: 'white', type: "亮色"},
  4. {name: '红色', color: 'red', type: "暗色"},
  5. {name: '蓝色', color: 'blue', type: "暗色"},
  6. {name: '黄色', color: 'yellow', type: "亮色"}
  7. ];

然后修改ng-options的语法:

  1. <select ng-model="colorChosen" ng-options="color.name group by color.type for color in colors">

运行效果:

图4-20 ng-options加上group by

禁用某些选项disable when

ng-options还可以通过disable when语法来设置选项是否可选,同样的,我们需要在列表中先新增字段:

注意,以下第一列数据并未加上disabled属性,这是为了表明如果没有这项数据,默认的ng-options的操作(可以选择)。

  1. $scope.colors = [
  2. {name: '黑色', color: 'black', type: "暗色"},
  3. {name: '白色', color: 'white', type: "亮色", disabled: false},
  4. {name: '红色', color: 'red', type: "暗色", disabled: true},
  5. {name: '蓝色', color: 'blue', type: "暗色", disabled: false},
  6. {name: '黄色', color: 'yellow', type: "亮色", disabled: true}
  7. ];

然后修改ng-options的语法:

  1. <select ng-model="colorChosen"
  2. ng-options="color.name group by color.type
  3. disable when color.disabled for color in colors">

运行结果:

可以看到,图中的”红色”和”黄色”变为了不可选择的状态。

图4-21 ng-options加上disable when

将对象作为参数传入

在上面的例子中,我们传入的是一个列表arrayng-options也支持以对象object的方式传入数据:

使用object的方式传入数据,一般是为了简化配置,比如我们采取如下的配置:

  1. $scope.countries = {
  2. CN: '中国China',
  3. US: '美国United States',
  4. UK: '英国United Kingdom',
  5. GR: '德国Germany'
  6. };
  7. $scope.country = 'CN';

注意,以下代码中,for后面有一个空格。如果没有,则无法成功运行!这是因为传入ng-options的其实是一串文本,而AngularJS需要解析这段文本,因此提出了对格式的要求。

  1. <div ng-controller="FirstCtrl">
  2. <label>选择一个国家(有空选项):
  3. <select ng-model="country" ng-options="k as v for (k, v) in countries">
  4. <option value="">-- 选择一个国家 --</option>
  5. </select>
  6. </label>
  7. <br>
  8. 当前选中的国家: {{ country }}
  9. </div>

运行结果,请注意列表中显示的值和选中时变量的值的关系。

图4-22 ng-options传入object作为数据