Удалить пустую опцию из опции выбора с помощью AngularJS

Я новичок в 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


person iCode    schedule 23.12.2013    source источник


Ответы (12)


Для справки: Почему angularjs включает пустой параметр в select?

Пустой option генерируется, когда значение, на которое ссылается ng-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

ОБНОВЛЕНИЕ (31 декабря 2015 г.)

Если вы не хотите устанавливать значение по умолчанию и хотите удалить пустую опцию,

<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;

person Shiju K Babu    schedule 23.12.2013
comment
объяснение действительно поможет - person jeremy; 14.07.2016
comment
Почему необходим перенос configs с $scope на $scope.feed? - person Piotr Dobrogost; 27.09.2016
comment
Итак ... что это значит, когда у меня есть действительное значение, но вместо использования этой опции мне по-прежнему выдается пустая строка? модель - 0, варианты 0, 50, 100 - выбор начинается с пустой строки - person TiggerToo; 10.03.2017

Несмотря на то, что все вышеперечисленные предложения работают, иногда мне нужно иметь пустой выбор (показывающий текст-заполнитель) при первом входе на мой экран. Итак, чтобы поле выбора не добавляло этот пустой выбор в начало (или иногда в конец) моего списка, я использую этот трюк:

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>

Теперь вы определили эту пустую опцию, поэтому поле выбора будет счастливым, но вы оставите его скрытым.

person RedSparkle    schedule 20.06.2015
comment
+1 за единственный ответ, который не инициализирует модель первым вариантом в списке. Моя странная реализация требовала, чтобы список выбора начинался пустым, но не включал пустой параметр при щелчке по списку выбора. Это единственное решение, которое у меня сработало. Спасибо! - person Billy McKee; 24.06.2015

Вот обновленная скрипка: http://jsfiddle.net/UKySp/

Вам нужно было установить исходное значение модели для фактического объекта:

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

И обновите свой выбор, чтобы он выглядел так:

<select ng-model="feed.config" ng-options="item.name for item in configs">
person Adam Putinski    schedule 23.12.2013

Другой способ решения проблемы - использовать: $first в ng-repeat

Использование:

<select ng-model="feed.config">
    <option ng-repeat="template in configs" ng-selected="$first">{{template.name}}</option>
</select>

Ссылки:

ngSelected: https://docs.angularjs.org/api/ng/directive/ngSelected

$ первый: https://docs.angularjs.org/api/ng/directive/ngRepeat

Ваше здоровье

person Roy M J    schedule 09.11.2015

Есть несколько способов, например -

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

Or

$scope.feed.config = $scope.configs[0].name;
person Bhalchandra K    schedule 23.12.2013

Это своего рода обходной путь, но работает как шарм. Просто добавьте <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>
person Himanshu Arora    schedule 25.10.2016
comment
это не скрывает параметр по умолчанию в IE, я думаю - person Rathma; 07.11.2017
comment
специально не тестировали это в IE - person Himanshu Arora; 08.11.2017

Если вы просто хотите удалить пустое пространство, используйте ng-show, и все готово! Не нужно инициализировать значение в JS.

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

Измените свой код вот так. Вы забываете о внутренней стоимости опциона. Прежде чем назначить 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'}
      ];
 });
person Anbu    schedule 12.12.2015

Используйте 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>
person Farzad.Kamali    schedule 19.03.2019

Для меня ответом на этот вопрос было использование <option value="" selected hidden />, как это было предложено @RedSparkle, плюс добавление ng-if="false" для работы в IE.

Итак, мой полный вариант (имеет отличия от того, что я писал ранее, но это не имеет значения из-за ng-if):

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

person Vladimir Mironov    schedule 21.03.2019

Наконец, у меня это сработало.

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


person Kabiraj Kharel    schedule 24.10.2019

Также проверьте, есть ли у вас ложное значение. Angularjs вставит пустую опцию, если у вас есть ложное значение. Я бился 2 дня только из-за фальшивой стоимости. Надеюсь, это будет кому-то полезно.

У меня были варианты [0, 1], и изначально я установил для модели значение 0 из-за того, что была вставлена ​​пустая опция. Обходной путь для этого был ["0", "1"].

person Deepchand yadav    schedule 24.10.2016