AngularJS - select的value属性

Pau*_*aul 72 select options angularjs

源JSON数据是:

[
  {"name":"Alabama","code":"AL"},
  {"name":"Alaska","code":"AK"},
  {"name":"American Samoa","code":"AS"},
  ...
]
Run Code Online (Sandbox Code Playgroud)

我试试

ng-options="i.code as i.name for i in regions"
Run Code Online (Sandbox Code Playgroud)

但我得到:

<option value="?" selected="selected"></option>
<option value="0">Alabama</option>
<option value="1">Alaska</option>
<option value="2">American Samoa</option>
Run Code Online (Sandbox Code Playgroud)

虽然我期待得到:

<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
<option value="AS">American Samoa</option>
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,如果我将$ scope.regions设置为静态JSON而不是AJAX请求的结果,则空项目将消失.

Mar*_*cok 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}}
Run Code Online (Sandbox Code Playgroud)

以上生成此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>
Run Code Online (Sandbox Code Playgroud)

小提琴

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

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

  • 我发现混淆和缺乏透明度,HTML并不反映范围中设置的值... (14认同)
  • @ProxyTech,我这样想:使用region.code为值分配给模型,但是向用户显示region.name.[API docs](http://docs.angularjs.org/api/ng.directive:select)将region.name部分称为`label`. (4认同)
  • 这是一种不同的思维方式.您实际上是在选择`region`**对象**,而不是`region.code`**string**.一旦用户选择了某些内容,就会选择`region`**对象**.然后,当您稍后想要代码时,只需访问`region.code`.希望有所帮助. (3认同)
  • 有人可以解释究竟是什么语法"region.code as region.name"实际上是"说"......它似乎对我来说似乎没什么意义.那个"as"关键字完全抛弃了我,因为我认为它在推断任何意义上都没有语法用法. (3认同)
  • @MarkRajcok这是我的C#范例,它会导致混淆"as"关键字用于从类型转换为另一个.然后是我的"英语"范例,其中关键字"as"表示"region.came"正在交互/取代"region.code"......完全不是上下文中的情况.我认为语法很简单. (3认同)

Ben*_*esh 26

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

<select ng-model="foo">
   <option ng-repeat="item in items" value="{{item.code}}">{{item.name}}</option>
</select>
Run Code Online (Sandbox Code Playgroud)

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

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

{{foo | json}}
Run Code Online (Sandbox Code Playgroud)

  • 虽然您的第一个示例生成了一个正常工作/正确的选择列表,并且您提醒您不要使用它,但请注意它与Angular的其余部分不兼容.例如,这不会按预期工作:<a ng-click="foo ='AK'">选择AK </a>.通常,value属性可能不应与Angular select指令一起使用. (3认同)

Jos*_*cha 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>
Run Code Online (Sandbox Code Playgroud)

生产:

<select>
    <option value="" selected="selected"></option>
    <option value="15">one</option>
    <option value="20">two</option>
</select>
Run Code Online (Sandbox Code Playgroud)


小智 7

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

<select ng-model="regions[index]" ng-options="....">
Run Code Online (Sandbox Code Playgroud)

之前已经回答过,请参阅以下内容:

为什么AngularJS在select中包含一个空选项?而这个小提琴

更新:尝试这样做:

<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>
Run Code Online (Sandbox Code Playgroud)

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


Oli*_*ger 5

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

$scope.options = {
    "AL" : "Alabama",
    "AK" : "Alaska",
    "AS" : "American Samoa"
  };
Run Code Online (Sandbox Code Playgroud)

然后用

<select ng-options="k as v for (k,v) in options"></select>
Run Code Online (Sandbox Code Playgroud)