源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请求的结果,那么空项就会消失。
答案 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>
即使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));