2013-10-04 9 views
50

Używam angularjs w projekcie, w którym używam opcji ng do generowania.ng-options jak ustawić pierwszy wybór zawsze pusty

Początkowo, gdy strona przeładować i żaden element nie jest zaznaczona opcja html wygenerowany jak poniżej:

<select size="3" ng-model="item" ng-options="s.name for s in itemlist"> 
<option value="?" selected="selected"></option> 
<option value="0">Item 1</option> 
<option value="1">Item 2</option> 
<option value="2">Item 3</option> 
</select> 

Ale kiedy wybierz element (ex pozycja 2). Pierwszą puste wybierz zniknął. Wiem, że dzieje się tak, ponieważ model ng jest ustawiany według wybranej wartości. Ale chcę, aby najpierw wybrać zawsze puste, aby użytkownik mógł zresetować filtr.

Z góry dziękuję.

Odpowiedz

126

to zrobi za Ciebie:

<select size="3" ng-model="item" ng-options="s.name for s in itemlist"> 
    <option value="">Select Option</option> 
</select> 
+0

To jest poprawna odpowiedź. – kmdsax

+0

Mój bohater! Od dłuższego czasu zmagam się z opcjami alternatywnymi, mając dokładnie ten sam problem co @arnold. To jedyne trwałe i trwałe rozwiązanie. Dziękuję Ci! –

+0

Dzięki temu omijam to przez chwilę. –

1

Wygląda na to, że najlepszym wyjściem byłoby umieszczenie pustego elementu jako pierwszego elementu w liście przedmiotów.

+1

która tworzy dwa puste pola wyboru podczas inicjowania dom. – arnold

1

Można zrezygnować z używania ng-options i zamiast tego użyć ng-repeat i pozostawić pierwszą opcję pustą. Zobacz przykład poniżej.

<select size="3" ng-model="item"> 
    <option value="?" selected="selected"></option> 
    <option ng-repeat="s in itemlist" value="{{s.value}}">{{s.name}}</option> 
</select> 
+1

ng-options jest "kanciastym sposobem" dla wybranych elementów i (po poprawnym użyciu) dodaje wiele funkcji, których nie ma powtórzenie ng. – rushkeldon

+3

@rushkeldon: Prosto z dokumentacji AngularJS: "W wielu przypadkach ngRepeat może być użyty na elementach

+0

@meconroy Ten sam link również stwierdza (mógł on zostać zaktualizowany od czasu, kiedy go opublikowałeś), że 'ng-options' jest bardziej wydajne - szybciej i zużywa mniej pamięci, ponieważ nie tworzy nowego zakresu dla każdego elementu na liście. – plamut

10

Dla kogoś tam, że leczyć „null” jako poprawną wartość jednej z opcji (tak wyobrazić, że „null” jest wartością jeden z elementów w TypeOptions w przykładzie poniżej), znalazłem, że najprostszym sposobem, aby upewnić się, że automatycznie dodana opcja jest ukryta, jest użycie ng-if.

<select ng-options="option.value as option.name for option in typeOptions"> 
    <option value="" ng-if="false"></option> 
</select> 

Dlaczego ng-if and not ng-hide? Ponieważ chcesz selektory css, które będą kierować pierwszą opcję wewnątrz powyżej, wybierz opcję "rzeczywistą", a nie tę, która jest ukryta. Przydaje się to, gdy używasz kątomierza do testowania e2e i (z dowolnego powodu) używasz by.css(), aby kierować wybrane opcje.

Kevin - Suu TAM

0
 <select ng-model="dataItem.platform_id" 
      ng-options="item.id as item.value for item in platformList" 
      ng-init="dataItem.platform_id=dataItem.platform_id||platformList[0].id"></select> 
1

Rozwiązanie powyżej woli skorumpowanego modelu z danymi śmieci. Proszę użyć dyrektywy zresetować model w odpowiedni sposób JS: Wybierz Option

Directive" 
.directive('dropDown', function($filter) { 
    return { 

     require: 'ngModel', 
     priority: 100, 
     link: function(scope, element, attr, ngModel) { 

      function parse(value) { 

       if (value) { 

        if(value === "") 
        { 
         return "crap" 
        } 
        else 
        { 
         return value; 
        } 

       } else { 
        return; 
       } 
      } 


      ngModel.$parsers.push(parse); 

     } 
    }; 
}); 
0

Controller

$scope.item = ''; 

$scope.itemlist = { 
    '' = '', 
    'Item 0' = 1, 
    'Item 1' = 2, 
    'Item 2' = 3 
}; 

HTML

<select data-ng-model="item" data-ng-options="v as k for (k, v) in itemlist"></select> 
Powiązane problemy