我对Angular和ng-options
感到有些困惑。
我有一个简单的数组,我想用它初始化一个选择。但是,我想要那个选项value = label。
$scope.options = ['var1', 'var2', 'var3'];
<select ng-model="myselect" ng-options="o for o in options"></select>
我得到了什么:
<option value="0">var1</option>
<option value="1">var2</option>
<option value="2">var3</option>
我想要的是什么:
<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>
所以我试过了:
<select ng-model="myselect2" ng-init=0 ng-options="options[k] as v for (k,v) in options"></select>
<select ng-model="myselect3" ng-init=0 ng-options="b as b for b in options"></select>
(但它不起作用。)
我的表单是外部提交的,这就是为什么我需要'var1'作为值而不是0。
答案 0 :(得分:295)
你实际上在第三次尝试中确实是正确的。
<select ng-model="myselect" ng-options="o as o for o in options"></select>
请参阅此处的工作示例: http://plnkr.co/edit/xEERH2zDQ5mPXt9qCl6k?p=preview
诀窍在于AngularJS无论如何都将键写为从0到n的数字,并在更新模型时进行转换。
因此,HTML看起来不正确,但在选择值时仍会正确设置模型。 (即AngularJS会将'0'翻译回'var1')
Epokk的解决方案也有效,但是如果您异步加载数据,您可能会发现它并不总是正确更新。当范围发生变化时,使用ngOptions将正确刷新。
答案 1 :(得分:33)
您可以ng-repeat
使用option
,如下所示:
<form>
<select ng-model="yourSelect"
ng-options="option as option for option in ['var1', 'var2', 'var3']"
ng-init="yourSelect='var1'"></select>
<input type="hidden" name="yourSelect" value="{{yourSelect}}" />
</form>
当您提交form
时,您可以隐藏输入值。
的 DEMO 强>
答案 2 :(得分:20)
你可以使用像
这样的东西<select ng-model="myselect">
<option ng-repeat="o in options" ng-selected="{{o==myselect}}" value="{{o}}">
{{o}}
</option>
</select>
使用ng-selected,如果预填充了myselect,则会预先选择该选项。
我更喜欢这种方法而不是ng-options,因为ng-options只适用于数组。 ng-repeat也适用于类似json的对象。
答案 3 :(得分:20)
如果您按以下方式设置选择:
<select ng-model="myselect" ng-options="b for b in options track by b"></select>
你会得到:
<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>
答案 4 :(得分:10)
<select ng-model="option" ng-options="o for o in options">
$ scope.option将等于&#39; var1&#39;改变后,即使你看到值=&#34; 0&#34;在生成的HTML中