过去几周我一直在使用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识别时,它就会包含一个无聊的选项。 你做错的是,当你使用ng-options时,它读取一个对象,说[{id: 10,名称:test}, {id: 11,名称:test2}]对吗?

这就是你的模型值需要的值,假设你想要选择的值为10,你需要设置你的模型值为{id: 10, name: test}以选择10,因此它不会创建那个垃圾。

希望这能帮助大家理解,我有一段艰难的时间尝试:)

其他回答

一个快速的解决方案:

select option:empty { display:none }

希望它能帮助到别人。理想情况下,选择的答案应该是方法,但如果这是不可能的,那么应该作为补丁工作。

虽然都是@pkozlowski。opensource和@Mark的答案是正确的,我想分享一下我稍微修改过的版本,我总是选择列表中的第一项,不管它的值是多少:

<select ng-options="option.value as option.name for option in typeOptions" ng-init="form.type=typeOptions[0].value">
</select>

如果你使用ng-init你的模型来解决这个问题:

<select ng-model="foo" ng-app ng-init="foo='2'">

当你无法控制选项时,使用jQuery的刷任务解决方案

html:

<select id="selector" ng-select="selector" data-ng-init=init() >
...
</select>

js:

$scope.init = function () {
    jQuery('#selector option:first').remove();
    $scope.selector=jQuery('#selector option:first').val();
}

我想补充一点,如果初始值来自某个父元素或1.5组件的绑定,请确保传递了正确的类型。如果在绑定中使用@,传递的变量将是string,如果选项为eg。整数,则会显示空选项。

正确解析init中的值,或者使用<而不是@绑定(为了提高性能,除非必要,建议少使用)。