AngularJS - select的value属性

时间:2012-12-10 15:12:49

标签: select angularjs options

源JSON数据是:

[
  {"name":"Alabama","code":"AL"},
  {"name":"Alaska","code":"AK"},
  {"name":"American Samoa","code":"AS"},
  ...
]

我试试

ng-options="i.code as i.name for i in regions"

但我得到了:

<option value="?" selected="selected"></option>
<option value="0">Alabama</option>
<option value="1">Alaska</option>
<option value="2">American Samoa</option>

虽然我期待得到:

<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
<option value="AS">American Samoa</option>

那么,如何获得价值属性并摆脱“?”项目

顺便说一下,如果我将$ scope.regions设置为静态JSON而不是AJAX请求的结果,那么空项就会消失。

8 个答案:

答案 0 :(得分:74)

您首先尝试的应该可以使用,但HTML并不是我们所期望的。我添加了一个选项来处理最初的“没有项目选择”的情况:

<select ng-options="region.code as region.name for region in regions" ng-model="region">
   <option style="display:none" value="">select a region</option>
</select>
<br>selected: {{region}}

以上生成此HTML:

<select ng-options="..." ng-model="region" class="...">
   <option style="display:none" value class>select a region</option>
   <option value="0">Alabama</option>
   <option value="1">Alaska</option>
   <option value="2">American Samoa</option>
</select>

Fiddle

即使Angular使用数值整数作为值,模型(即$ scope.region)也会根据需要设置为AL,AK或AS。 (当从列表中选择一个选项时,Angular使用该数值来查找正确的数组条目。)

首次学习Angular如何实现其“select”指令时,这可能会令人困惑。

答案 1 :(得分:26)

除非你自己在ng-repeat中构建它们,否则你无法真正做到这一点。

<select ng-model="foo">
   <option ng-repeat="item in items" value="{{item.code}}">{{item.name}}</option>
</select>

但是......这可能不值得。最好让它按设计运行,让Angular处理内部工作。 Angular以这种方式使用索引,因此您实际上可以将整个对象用作值。因此,您可以使用下拉绑定来选择整个值而不仅仅是一个字符串,这非常棒:

<select ng-model="foo" ng-options="item as item.name for item in items"></select>

{{foo | json}}

答案 2 :(得分:21)

如果您使用track by选项,则会正确写入value属性,例如:

<div ng-init="a = [{label: 'one', value: 15}, {label: 'two', value: 20}]">
    <select ng-model="foo" ng-options="x for x in a track by x.value"/>
</div>

产生

<select>
    <option value="" selected="selected"></option>
    <option value="15">one</option>
    <option value="20">two</option>
</select>

答案 3 :(得分:7)

如果为下拉列表指定的模型不存在,则angular将生成一个空选项元素。所以你必须在select上明确指定模型:

<select ng-model="regions[index]" ng-options="....">

如前所述,请参阅以下内容:

Why does AngularJS include an empty option in select?和此fiddle

更新:请改为尝试:

<select ng-model="regions[index].code" ng-options="i.code as i.name for i in regions">
</select>

or

<select ng-model="regions[2]" ng-options="r.name for r in regions">
</select>

请注意,select中没有空选项元素。

答案 4 :(得分:5)

您可以将模型修改为如下所示:

$scope.options = {
    "AL" : "Alabama",
    "AK" : "Alaska",
    "AS" : "American Samoa"
  };

然后使用

<select ng-options="k as v for (k,v) in options"></select>

答案 5 :(得分:4)

似乎不可能以任何有意义的方式将选择的“值”用作普通的HTML表单元素,并且还可以使用ng-options以批准的方式将其连接到Angular。作为妥协,我最终不得不在我的选择旁边放置一个隐藏的输入,并让它跟我选择的跟踪相同的模型,就像这样(为了简洁起见,所有这些都非常简化):

HTML:

<select ng-model="profile" ng-options="o.id as o.name for o in profiles" name="something_i_dont_care_about">
</select>
<input name="profile_id" type="text" style="margin-left:-10000px;" ng-model="profile"/>

使用Javascript:

App.controller('ConnectCtrl',function ConnectCtrl($scope) {
$scope.profiles = [{id:'xyz', name:'a profile'},{id:'abc', name:'another profile'}];
$scope.profile = -1;
}

然后,在我的服务器端代码中,我只是寻找params[:profile_id](这恰好是一个Rails应用程序,但同样的原则适用于任何地方)。因为隐藏的输入跟踪与选择相同的模型,所以它们保持自动同步(不需要额外的javascript)。这是Angular很酷的部分。它几乎弥补了它对value属性的影响作为副作用。

有趣的是,我发现这种技术只适用于未隐藏的输入标签(这就是为什么我必须使用margin-left:-10000px;技巧将输入移出页面)。这两种变化不起作用:

<input name="profile_id" type="text" style="display:none;" ng-model="profile"/>

<input name="profile_id" type="hidden" ng-model="profile"/>

我觉得这一定意味着我错过了一些东西。对于Angular而言,这似乎太奇怪了。

答案 6 :(得分:1)

你可以使用

state.name for state in states track by state.code

在JSON数组中的状态中,state是数组中每个对象的变量名。

希望这有帮助

答案 7 :(得分:-2)

尝试如下:

var scope = $(this).scope();
alert(JSON.stringify(scope.model.options[$('#selOptions').val()].value));