2012-11-07 9 views
23

Ho un controller di visualizzazione e un controller di gestione. All'interno del mio controller del display, ho un selettore a discesa con l'elenco degli elementi che sono stati selezionati.Utilizzando AngularJS, come si associa un elemento a un attributo che si aggiorna tramite un servizio

È possibile ottenere il menu a discesa dell'area di visualizzazione per aggiornare l'elenco, aggiungendo gli elementi man mano che vengono aggiunti nel controller di gestione, ma non riesco a capire come selezionare l'elemento più recente nel menu a discesa.

<div ng-controller="MyDisplayCtrl"> 
    <select ng-model="item" ng-options="i.name for i in items"> 
    </select> 
</div> 

Ho fatto un jsfiddle per illustrare la mia situazione. In definitiva, però, la mia domanda è come associare quel ng-model = "item" a un'origine dati aggiornata da un servizio.

http://jsfiddle.net/whtevn/mUhPW/2/

risposta

15

Beh, sembra che ho trovato una risposta abbastanza soddisfacente a questo.

esposi l'oggetto di archiviazione stesso attraverso il controllore

function MyDisplayCtrl($scope, ItemStore) { 
    $scope.items = ItemStore.items; 
    $scope.item = ItemStore.currentItem; 

    // expose the itemstore service to the dom 
    $scope.store = ItemStore 

    $scope.getItem = function(){ 
     return(ItemStore.currentItem); 
    } 
} 

e quindi risolvere il CurrentItem direttamente

<div ng-controller="MyDisplayCtrl"> 
    <select ng-model="store.currentItem" ng-options="i.name for i in items"> 
    </select> 
</div> 

http://jsfiddle.net/whtevn/Cp2RJ/3/

+0

questo funziona bene, e mi sono spostato su di esso come modello predefinito, ma se qualcuno ha una ragione per cui non dovrei chiamare servizi esposti nelle mie visualizzazioni, mi piacerebbe sentirlo – whtevn

+0

Una ragione Posso pensare al caching. Se la funzionalità del tuo servizio cambia, dovrai modificare la tua vista, che potrebbe essere in modo aggressivo nella cache, invece delle interiora del tuo controller. Secondo la mia esperienza è più facile eliminare i file JavaScript esterni e questa sarebbe una separazione più pura delle preoccupazioni. Lascia che il tuo controller popoli l'ambito e la tua vista acceda a tale ambito. –

+0

Attraverso un video che ho guardato su un sito di formazione, l'utilizzo di servizi esposti nelle visualizzazioni è una buona pratica. Tuttavia, il modo in cui i servizi sono scritti e costruiti è stato raccomandato utilizzando un modello di modulo rivelatore piuttosto che dare accesso alle variabili restituire le funzioni e le proprietà che dovrebbero essere pubblicamente accettabili: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript. Inoltre, i servizi sono stati creati usando il metodo .factory piuttosto che .service. –

Problemi correlati