2015-05-05 13 views
40

JSfiddleangularjs - NG-model w SELECT

Problem:

Mam select-element mojej stronie, która jest wypełniona wz ng-repeat. Ma również wartość ng-model, która ma wartość domyślną.

Kiedy zmieniam wartość, ng-model dostosowuje się, to jest w porządku. Ale lista rozwijana pokazuje puste miejsce przy uruchomieniu, w którym powinien znajdować się element z ustawioną wartością domyślną.

Kod

<div ng-app ng-controller="myCtrl"> 
    <select class="form-control" ng-change="unitChanged()" ng-model="data.unit"> 
     <option ng-repeat="item in units" ng-value="item.id">{{item.label}}</option> 
    </select> 
</div> 

z JS:

function myCtrl ($scope) { 
    $scope.units = [ 
     {'id': 10, 'label': 'test1'}, 
     {'id': 27, 'label': 'test2'}, 
     {'id': 39, 'label': 'test3'}, 
    ] 

     $scope.data = { 
     'id': 1, 
     'unit': 27 
     } 

}; 

Odpowiedz

54

Można użyć dyrektywy ng-selected na elementach opcjonalnych. Wyraża się, że jeśli prawda ustawi wybraną właściwość.

W tym przypadku:

<option ng-selected="data.unit == item.id" 
     ng-repeat="item in units" 
     ng-value="item.id">{{item.label}}</option> 

Demo

angular.module("app",[]).controller("myCtrl",function($scope) { 
 
    $scope.units = [ 
 
     {'id': 10, 'label': 'test1'}, 
 
     {'id': 27, 'label': 'test2'}, 
 
     {'id': 39, 'label': 'test3'}, 
 
    ] 
 

 
     $scope.data = { 
 
     'id': 1, 
 
     'unit': 27 
 
     } 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="myCtrl"> 
 
    <select class="form-control" ng-change="unitChanged()" ng-model="data.unit"> 
 
     <option ng-selected="data.unit == item.id" ng-repeat="item in units" ng-value="item.id">{{item.label}}</option> 
 
    </select> 
 
</div>

+0

Wykonało to zadanie: inne odpowiedzi są przydatne, ale nie mogę zmienić formatów danych, ponieważ są one używane w innych miejscach, a także w innych sytuacjach. Rozwiązało to problem, nie psując innych danych. – Jordumus

+1

Kątowe dokumenty dla ['ngSelected'] (https://docs.angularjs.org/api/ng/directive/ngSelected) mówią, że nie powinny być używane z' ngModel'. –

13

spróbować następujący kod:

w kontroler:

function myCtrl ($scope) { 
     $scope.units = [ 
     {'id': 10, 'label': 'test1'}, 
     {'id': 27, 'label': 'test2'}, 
     {'id': 39, 'label': 'test3'}, 
     ]; 

    $scope.data= $scope.units[0]; // Set by default the value "test1" 
}; 

W swojej strony:

<select ng-model="data" ng-options="opt as opt.label for opt in units "> 
       </select> 

Working Fiddle

+0

Jest to dobre rozwiązanie, ale nie pomoże mi to w mojej sytuacji, ponieważ nie mogę zmienić formatu moich danych. Skopiowałem ten fragment do wykorzystania w innych sytuacjach w przyszłości! – Jordumus

+0

Jak wyświetlasz w HTML z powiązaniem danych, która opcja została wybrana? –

+0

@StephenKuehl Musisz ustawić swój model (var przekazany do ngModel) z wybraną wartością, którą chcesz. – Disfigure

0

Wybierz za wartość domyślna powinna być jednym z jego wartości na liście. Aby załadować select z wartością domyślną, możesz użyć opcji ng-options. Zmienna zakresu musi być ustawiona w kontrolerze i ta zmienna jest przypisana jako ng-model w znaczniku HTML.

Zobacz plunker wszelkich odniesień:

http://embed.plnkr.co/hQiYqaQXrtpxQ96gcZhq/preview

5

Nie trzeba zdefiniować znaczniki opcji, można to zrobić za pomocą ngOptions dyrektywy: https://docs.angularjs.org/api/ng/directive/ngOptions

<select class="form-control" ng-change="unitChanged()" ng-model="data.unit" ng-options="unit.id as unit.label for unit in units"></select> 
+1

denerwujące częścią tego rozwiązania jest to, że ng-model ustawia cel na to, co powtarzasz w opcjach opcji. Nie ma możliwości, aby ustawić na pole powtarzające się (takie jak id). – Sam

2

Jednak ngOptions zapewnia pewne korzyści, takie jak zmniejszenie ilości pamięci i zwiększenie prędkości, ponieważ nie tworzy nowego zakresu dla każdej powtarzanej instancji. angular docs

Alternatywnym rozwiązaniem jest zastosowanie dyrektywy ng-init. Możesz określić funkcję, która będzie inicjować twoje domyślne dane.

$scope.init = function(){ 
      angular.forEach($scope.units, function(item){ 
       if(item.id === $scope.data.unit){ 
        $scope.data.unit = item; 
       } 
      }); 
     } 

Zobacz jsfiddle

1

Można również umieścić przedmiot o wartości domyślnej wybranego z NG-powtarzają jak następujące:

<div ng-app="app" ng-controller="myCtrl"> 
    <select class="form-control" ng-change="unitChanged()" ng-model="data.unit"> 
     <option value="yourDefaultValue">Default one</option> 
     <option ng-selected="data.unit == item.id" ng-repeat="item in units" ng-value="item.id">{{item.label}}</option> 
    </select> 
</div> 

i nie zapomnij atribute wartość, jeśli zostaw to puste, będziesz miał ten sam problem.

Powiązane problemy