使用AngularJS从选择选项中删除空白选项


80

我是AngularJS的新手。我搜索了很多,但是并不能解决我的问题。

我第一次在选择框中得到一个空白选项。

这是我的HTML代码

<div ng-app="MyApp1">
    <div ng-controller="MyController">
        <input type="text" ng-model="feed.name" placeholder="Name" />
        <select ng-model="feed.config">
            <option ng-repeat="template in configs">{{template.name}}</option>
        </select>
    </div>
</div>

JS

var MyApp=angular.module('MyApp1',[])
MyApp.controller('MyController', function($scope) {
    $scope.feed = {};

      //Configuration
      $scope.configs = [
                                 {'name': 'Config 1',
                                  'value': 'config1'},
                                 {'name': 'Config 2',
                                  'value': 'config2'},
                                 {'name': 'Config 3',
                                  'value': 'config3'}
                               ];
      //Setting first option as selected in configuration select
      $scope.feed.config = $scope.configs[0].value;
});

但这似乎不起作用。我该如何解决?这是JSFiddle演示

Answers:


95

供参考:为什么angularjs在select中包含一个空选项

optionng-model传递给的一组选项中不存在被引用的值时,将生成空值ng-options。这样做是为了防止意外选择模型:AngularJS可以看到初始模型是未定义的还是未在选项集中,并且不想自己决定模型的值。

简而言之:空选项意味着没有选择有效的模型(有效的意思是:从选项集中)。您需要选择一个有效的模型值来摆脱此空选项。

像这样更改您的代码

var MyApp=angular.module('MyApp1',[])
MyApp.controller('MyController', function($scope) {
  $scope.feed = {};

  //Configuration
  $scope.feed.configs = [
    {'name': 'Config 1',
     'value': 'config1'},
    {'name': 'Config 2',
     'value': 'config2'},
    {'name': 'Config 3',
     'value': 'config3'}
  ];
  //Setting first option as selected in configuration select
  $scope.feed.config = $scope.feed.configs[0].value;
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div ng-app="MyApp1">
  <div ng-controller="MyController">
    <input type="text" ng-model="feed.name" placeholder="Name" />
    <!-- <select ng-model="feed.config">
<option ng-repeat="template in configs">{{template.name}}</option>
</select> -->
    <select ng-model="feed.config" ng-options="template.value as template.name for template in feed.configs">
    </select>
  </div>
</div>

工作中的JSFiddle演示

更新(2015年12月31日)

如果您不想设置默认值并想删​​除空白选项,

<select ng-model="feed.config" ng-options="template.value as template.name for template in feed.configs">
      <option value="" selected="selected">Choose</option>
</select>

并且在JS中无需初始化值。

$scope.feed.config = $scope.feed.configs[0].value;


2
一个解释确实有帮助
jeremy

3
为什么configs要从必要$scope转变为$scope.feed必要?
Piotr Dobrogost

那么...当我确实具有有效值并且仍然给我空行而不是使用该选项时是什么意思?型号-0,选项
0、50、100-

55

尽管以上所有建议均有效,但有时在初次进入屏幕时需要选择一个空白(显示占位符文本)。因此,为防止选择框在列表的开头(或有时在结尾)添加此空选择,我在使用此技巧:

HTML代码

<div ng-app="MyApp1">
    <div ng-controller="MyController">
        <input type="text" ng-model="feed.name" placeholder="Name" />
        <select ng-model="feed.config" ng-options="template.value as template.name for template in feed.configs" placeholder="Config">
            <option value="" selected hidden />
        </select>
    </div>
</div>

现在,您已经定义了此空选项,因此选择框是满意的,但您将其保持隐藏状态。


4
对于未将模型初始化为列表中第一个选项的唯一答案,+ 1。我的怪异实现需要选择列表开始空白,但单击选择列表时不包括空白选项。这是唯一对我有用的解决方案。谢谢!
比利·麦基

21

这是更新的小提琴:http : //jsfiddle.net/UKySp/

您需要将初始模型值设置为实际对象:

$scope.feed.config = $scope.configs[0];

并更新您的选择,使其如下所示:

<select ng-model="feed.config" ng-options="item.name for item in configs">


4

有多种方法,例如-

<select ng-init="feed.config = options[0]" ng-model="feed.config"
        ng-options="template.value as template.name for template in feed.configs">
</select>

要么

$scope.feed.config = $scope.configs[0].name;

3

这是一种解决方法,但是却很有吸引力。只需添加<option value="" style="display: none"></option>为填充物即可。像:

<select size="4" ng-model="feed.config" ng-options="template.value as template.name for template in feed.configs">
       <option value="" style="display: none"></option>
</select>

1
我猜这不会隐藏IE中的默认选项
Rathma

1
尚未在IE中进行具体测试
Himanshu Arora

3

如果您只想删除空格,请使用ng-show并完成!无需在JS中初始化值。

<select ng-model="SelectedStatus" ng-options="x.caption for x in statusList">
    <option value="" ng-show="false"></option>
</select>`

2

像这样更改您的代码。您会忘记选项内部的值。在分配ng-model之前。它必须有一个值。只有这样,它才能获取未定义的值。

<div ng-app="MyApp1">
<div ng-controller="MyController">
    <input type="text" ng-model="feed.name" placeholder="Name" />
     <select ng-model="feed">
        <option ng-repeat="template in configs" value="template.value">{{template.name}}    
 </option>
    </select>
    </div>
 </div>

JS

 var MyApp=angular.module('MyApp1',[])
 MyApp.controller('MyController',function($scope) {  
      $scope.feed = 'config1';      
      $scope.configs = [
         {'name': 'Config 1', 'value': 'config1'},
         {'name': 'Config 2', 'value': 'config2'},
         {'name': 'Config 3', 'value': 'config3'}
      ];
 });

1

使用ng-value代替value

$scope.allRecs = [{"text":"hello"},{"text":"bye"}];
$scope.X = 0;

然后在html文件中应该是这样的:

<select ng-model="X">  
     <option ng-repeat="oneRec in allRecs track by $index" ng-value="$index">{{oneRec.text}}</option>
</select>

0

对我来说,这个问题的答案是使用<option value="" selected hidden />@RedSparkle提出的,并添加ng-if="false"到IE中。

因此,我的完整选择是(与我之前写的内容有所不同,但这并不重要,因为ng-if):

<option value="" ng-if="false" disabled hidden></option>


0

终于对我有用。

<select ng-init="mybasketModel = basket[0]" ng-model="mybasketModel">
        <option ng-repeat="item in basket" ng-selected="$first">{{item}}</option>
</select>



-1

还要检查您是否有虚假的值。如果您确实有错误的值,Angularjs将插入一个空选项。由于虚假的价值,我挣扎了2天。希望对您有所帮助。

我的选项为[0,1],最初我将模型设置为0,因为它被插入为空选项。解决方法是[“ 0”,“ 1”]。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.