Valore predefinito su Select2 con ng-repeat con dati provenienti da una chiamata API
-
21-12-2019 - |
Domanda
Ho un select2 angolare come segue:
<select ui-select2 id="clientID" name="clientID" ng-model="newTicket.clientstate" ng-required="true">
<option ng-repeat="item in clients track by item.id" value="{{item.clientID}}|{{item.stateID}}" >{{item.displayName}}</option>
</select>
nel mio controller, i client sono impostati in questo modo (chiamando un servizio che restituisce $promise da $resource):
TicketService.getClients().then(
function(clients) {
$scope.clients = clients;
}
);
Ho anche impostato il valore iniziale di $scope.newTicket.clientstate nel controller.Poiché la chiamata a $resource è asincrona, l'impostazione del valore iniziale avviene prima che la query venga risolta.
Sto cercando di fare in modo che il menu a discesa compili un valore iniziale ("DEMO|DEMO") al termine della chiamata API.Penso che la soluzione sia una delle 3 cose:impostando ng-init su select, impostando ng-selected su ng-repeat o facendo qualcosa in .then() che si verifica dopo che l'API restituisce la query.Tuttavia, non riesco a far funzionare la sintassi corretta e speravo di ricevere qualche consiglio su come procedere.
Il mio primo tentativo per risolvere le cose (puoi vederlo nei commenti qui sotto) è stato convertire tutto in ng-options, ma la libreria ui-select2 è incompatibile con ng-op[tions, quindi sto cercando un'altra possibilità.
Soluzione
Mi sono appena imbattuto nella stessa cosa e un ragazzo al lavoro mi ha indicato la giusta direzione.
A quanto pare io e te stavamo cercando di complicare eccessivamente la soluzione.Tutto quello che devi fare è:
TicketService.getClients().then(
function(clients) {
$scope.clients = clients;
// set the default value after the list comes back
$scope.newTicket.clientstate = 'yourDefaultValue';
}
);
Allora dovresti essere a posto!
Assicurati solo di aver inizializzato $scope.newTicket
prima di questo, altrimenti riceverai un errore che dice che non puoi accedere alle proprietà di un oggetto non definito.
E lo presumo getClients()
restituisce a $promise
oggetto?Altrimenti dovrai fare una delle seguenti operazioni:
TicketService.getClients(function(clients){...}))
O:
TicketService.getClients().$promise.then(function(clients){...}))