Usuń pustą opcję z Select Option with AngularJS


80

Jestem nowy w AngularJS. Szukałem dużo, ale to nie rozwiązuje mojego problemu.

Po raz pierwszy otrzymuję pustą opcję w polu wyboru.

Oto mój kod 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;
});

Ale to nie działa. Jak mogę to rozwiązać? Oto demo JSFiddle

Odpowiedzi:


95

Dla porównania: dlaczego angularjs zawiera pustą opcję w select ?

Wartość pusta optionjest generowana, gdy wartość, do której odwołuje się odwołanie ng-model, nie istnieje w zestawie opcji przekazanych do ng-options. Dzieje się tak, aby zapobiec przypadkowemu wybraniu modelu: AngularJS widzi, że model początkowy jest albo niezdefiniowany, albo nie znajduje się w zestawie opcji i nie chce samodzielnie decydować o wartości modelu.

W skrócie: pusta opcja oznacza, że ​​nie został wybrany żaden ważny model (przez poprawny mam na myśli: ze zbioru opcji). Aby pozbyć się tej pustej opcji, musisz wybrać prawidłową wartość modelu.

Zmień swój kod w ten sposób

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>

Działające demo JSFiddle

UPDATE (31 grudnia 2015 r.)

Jeśli nie chcesz ustawiać wartości domyślnej i chcesz usunąć pustą opcję,

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

A w JS nie ma potrzeby inicjowania wartości.

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


2
wyjaśnienie naprawdę by pomogło
jeremy

3
Dlaczego przejście configsz $scopedo jest $scope.feedkonieczne?
Piotr Dobrogost

Więc ... co to znaczy, kiedy mam prawidłową wartość i nadal wyświetla mi się pusty wiersz zamiast używać tej opcji? model - 0, opcje 0, 50, 100 - wybierz początek w pustej linii
TiggerToo

56

Chociaż wszystkie powyższe sugestie działają, czasami potrzebuję pustego zaznaczenia (pokazującego tekst zastępczy), gdy po raz pierwszy wchodzę na mój ekran. Tak więc, aby zapobiec dodaniu tego pustego zaznaczenia na początku (lub czasami na końcu) mojej listy, używam tej sztuczki:

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

Teraz zdefiniowałeś tę pustą opcję, więc pole wyboru jest szczęśliwe, ale pozostawiasz je ukryte.


4
+1 za jedyną odpowiedź, która nie inicjalizuje modelu do pierwszej opcji na liście. Moja dziwna implementacja wymagała, aby lista wyboru była pusta, ale nie zawierała pustej opcji po kliknięciu listy wyboru. To jedyne rozwiązanie, które u mnie zadziałało. Dzięki!
Billy McKee

21

Oto zaktualizowane skrzypce: http://jsfiddle.net/UKySp/

Trzeba było ustawić początkową wartość modelu na rzeczywisty obiekt:

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

I zaktualizuj swój wybór, aby wyglądał tak:

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


4

Istnieje wiele sposobów, takich jak -

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

Lub

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

3

Jest to rodzaj obejścia, ale działa jak urok. Po prostu dodaj <option value="" style="display: none"></option>jako wypełniacz. Jak w:

<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
to nie ukrywa domyślnej opcji w IE, jak sądzę
Rathma,

1
nie testowałem tego specjalnie w IE
Himanshu Arora

3

Jeśli chcesz tylko usunąć puste miejsce, użyj ng-show i gotowe! Nie ma potrzeby inicjowania wartości w JS.

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

2

Zmień swój kod w ten sposób. Zapominasz o wartości wewnątrz opcji. Zanim przypiszesz ng-model. Musi mieć jakąś wartość. Tylko wtedy nie otrzymuje niezdefiniowanej wartości.

<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

Użyj wartości ng zamiast wartości .

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

a następnie w pliku html powinno wyglądać następująco:

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

0

Dla mnie odpowiedzią na to pytanie było użycie <option value="" selected hidden />tak jak to zaproponował @RedSparkle plus dodanie ng-if="false"do pracy w IE.

Więc moja pełna opcja to (ma różnice w stosunku do tego, co napisałem wcześniej, ale to nie ma znaczenia z powodu ng-if):

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


0

Wreszcie zadziałało.

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



-1

Sprawdź również, czy masz jakąś fałszywą wartość, czy nie. Angularjs wstawi pustą opcję, jeśli masz fałszywą wartość. Walczyłem przez 2 dni tylko z powodu fałszywej wartości. Mam nadzieję, że komuś to pomoże.

Miałem opcje [0, 1] i początkowo ustawiłem model na 0, dlatego wstawiono pustą opcję. Obejściem tego problemu było [„0”, „1”].

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.