2013-06-21 4 views
5

Ho una domanda su come impostare ng-modello nella combinazione di widget e AngularJS scelto (vedi questo video: https://www.youtube.com/watch?v=8ozyXwLzFYs)angolare + prescelto: valori selezionati

Quello che vorrei fare è impostare i destinatari ad alcuni valori che sarebbe preselezionato. Ecco HTML e JS per questo esempio (dal video)

<h1>Chosen</h1> 
    <select data-placeholder="Choose a Recipient" multiple class="span4 chzn-select" chosen 
     ng-model="recipients" ng-options="recipient.name for recipient in recipientsList"> 
    </select> 

    <p ng-repeat="recipient in recipients"><strong>{{recipient.name}}</strong></p> 

E JS controller

$scope.recipientsList = []; 
    $scope.recipients = []; 
    $scope.fetchRecipients = function() { 
     $http.get($scope.url).then(function(result){ 

     $scope.recipientsList = [ 
    {"id":0, "name":"Recipient 0"}, 
    {"id":1, "name":"Recipient 1"}, 
    {"id":2, "name":"Recipient 2"}, 
    {"id":3, "name":"Recipient 3"}, 
    {"id":4, "name":"Recipient 4"}, 
    {"id":5, "name":"Recipient 5"}, 
    {"id":6, "name":"Recipient 6"}, 
    {"id":7, "name":"Recipient 7"}, 
    {"id":8, "name":"Recipient 8"}, 
    {"id":9, "name":"Recipient 9"}, 
    {"id":10, "name":"Recipient 10"} 
]; 
    $scope.recipients = [{"id":0, "name":"Recipient 0"}, 
    {"id":1, "name":"Recipient 1"}]; 
    }); 
    } 

    $scope.fetchRecipients(); 

ho provato un paio di combinazione ma i valori nel menu non sono preselezionati, anche se sono memorizzati nei destinatari, perché sono visibili sotto il menu. Potete vedere questo esempio qui: http://jsfiddle.net/YKZSw/8/

Grazie per i vostri ansers.

attributo Matej

risposta

4

AngularJS ngOptions seleziona un elemento della matrice disponibile come sorgente dati. Nel tuo caso, la matrice recipientsList contiene un certo numero di oggetti. Tuttavia, gli elementi che desideri preselezionare non sono presenti nell'elenco a causa della disuguaglianza degli oggetti, anche se sono simili. Significato destinatariLista: {"id": 0, "nome": "Recipient 0"} non è uguale ai destinatari: {"id": 0, "nome": "Destinatario 0"} (Puoi provare lo stesso nel Console JS). Angolare non trova l'elemento nella lista e quindi non preseleziona.

Questo violino modificato funziona: http://jsfiddle.net/mananbharara/YKZSw/9/ L'unica differenza in questo caso è nella definizione dei destinatari:

$scope.recipients = [$scope.recipientsList[0], $scope.recipientsList[1]];

In questo caso si dispone di una sola lista e valori selezionati può venire solo da quella lista.

Un'alternativa a questo approccio che si utilizzerà nel caso in cui sia necessario mantenere due elenchi consiste nel mantenere il valore di selezione come tipo primitivo. In tal caso l'eguaglianza primitiva avrebbe sempre avuto.

+0

questo comportamento non causerebbe problemi quando i filtri sono coinvolti? Ecco un jsfiddle in cui il problema si ferma dalla preselezione, qualche suggerimento su come risolvere questo problema? http://jsfiddle.net/wKMZM/13/ – ragche

+0

Sembra che tu abbia commesso un errore durante l'impostazione del valore iniziale di 'myModel'. Ciò che il tuo markup suggerisce è che desideri associare i valori stringa mentre imposti il ​​valore iniziale su un 'Oggetto'. Ecco il [aggiornamento fiddle] (http://jsfiddle.net/wKMZM/15/) che sembra funzionare. Invece di fare '$ scope.myModel = {tipo: 'ninjacat'};', quello che sembra funzionare è: '$ scope.myModel = 'ninjacat'' – manan

6

Dalla versione 1.1.5 di AngularJS, è stata aggiunta una clausola track by.

Questo dovrebbe aiutare. Nel tuo caso, puoi aggiungere una traccia tramite id.