过去几周我一直在使用AngularJS,有一件事真的困扰着我,即使在http://docs.angularjs.org/api/ng.directive:select的规范中尝试了所有的排列或配置,我仍然得到一个空选项作为select元素的第一子元素。

这是玉:

select.span9(ng-model='form.type', required, ng-options='option.value as option.name for option in typeOptions');

下面是控制器:

$scope.typeOptions = [
    { name: 'Feature', value: 'feature' },
    { name: 'Bug', value: 'bug' },
    { name: 'Enhancement', value: 'enhancement' }
];

最后,这里是生成的HTML:

<select ng-model="form.type" required="required" ng-options="option.value as option.name for option in typeOptions" class="span9 ng-pristine ng-invalid ng-invalid-required">
    <option value="?" selected="selected"></option>
    <option value="0">Feature</option>
    <option value="1">Bug</option>
    <option value="2">Enhancement</option>
</select>

我需要做什么才能摆脱它?

附注:没有这个也可以工作,但是如果使用select2而没有多重选择,它看起来很奇怪。


当前回答

我使用的是Angular 1.4x,我找到了这个例子,所以我用ng-init在select中设置初始值:

<select ng-init="foo = foo || items[0]" ng-model="foo" ng-options="item as item.id for item in items"></select>

其他回答

参考angularjs文档中的例子如何克服这些问题。

点击这里的文档链接 查找“通过ngModel解析/格式化将select绑定到非字符串值” 你可以看到,指令convertToNumber解决了这个问题。

这对我很管用。也可以看到它是如何工作在这里

类似的事情也发生在我身上,这是由升级到angular 1.5引起的。ng-init似乎在Angular的新版本中被解析为类型。在旧的Angular中,ng-init="myModelName=600"会映射到一个值为"600"的选项,即<option value="600",但在Angular 1.5中,它不会发现这个,因为它似乎期望找到一个值为600的选项,即<option value=600 First</option>。然后Angular会插入一个随机的第一项:

<option value="? number:600 ?"></option>

Angular < 1.2.x

<select ng-model="myModelName" ng-init="myModelName=600">
  <option value="600">First</option>
  <option value="700">Second</option>
</select>

Angular > 1.2

<select ng-model="myModelName" ng-init="myModelName='600'">
  <option value="600">First</option>
  <option value="700">Second</option>
</select>

当ng-model属性未定义时,ng-model将创建空选项值。如果我们将object赋值给ng-model,就可以避免这种情况

例子

角编码

$scope.collections = [
    { name: 'Feature', value: 'feature' }, 
    { name: 'Bug', value: 'bug' }, 
    { name: 'Enhancement', value: 'enhancement'}
];

$scope.selectedOption = $scope.collections[0];


<select class='form-control' data-ng-model='selectedOption' data-ng-options='item as item.name for item in collections'></select>

重要提示:

为数组对象赋值,如$scope。集合[0]或$scope。集合[1]到ng-model,不使用对象属性。如果你从服务器获取选择选项值,使用回调函数,将对象分配给ng-model

来自Angular文档的说明

注意:ngModel比较的是引用,而不是值。当绑定到对象数组时,这很重要。参见示例http://jsfiddle.net/qWzTb/

我试了很多次终于找到了。

我也遇到过同样的问题。如果你要用普通的post来发布angular表单,那么你就会面临这个问题,因为angular不允许你像以前那样为选项设置值。如果你得到form的值。输入“然后你会找到正确的值。你必须将angular对象自己发布,而不是form post。

这完全没问题

<select ng-model="contact.Title" ng-options="co for co in['Mr.','Ms.','Mrs.','Dr.','Prof.']">
    <option style="display:none" value=""></option>
</select>

它的工作方式是,这给了第一个选项显示之前选择的东西和显示:没有删除它从下拉菜单,所以如果你想要,你可以这样做

<select ng-model="contact.Title" ng-options="co for co in['Mr.','Ms.','Mrs.','Dr.','Prof.']">
    <option style="display:none" value="">select an option...</option>
</select>

这将在选择之前给你选择和选项,但一旦选择,它就会消失,不会在下拉列表中显示。