2014-11-06 14 views
5

ho ereditato un'applicazione angolare e ora hanno bisogno di fare un cambiamento.ordine Controllo di esecuzione in angularjs

Come parte di questo cambiamento, alcuni dati deve essere impostata in un controllore e poi utilizzato da un altro. Così ho creato un servizio e avevo un controller in cui scrivere i dati e un controller ne legge i dati.

angular.module('appRoot.controllers') 

.controller('pageController', function (myApiService, myService) { 
    // load data from API call 
    var data = myApiService.getData(); 

    // Write data into service 
    myService.addData(data); 
}) 

.controller('pageSubController', function (myService) { 
    // Read data from service 
    var data = myService.getData(); 

    // Do something with data.... 
}) 

Tuttavia, quando vado a utilizzare data in pageSubController è sempre indefinito.

Come posso fare in modo che pageController eseguito prima pageSubController? O è anche la domanda giusta da porre?

EDIT

mio codice di servizio:

angular.module('appRoot.factories') 

.factory('myService', function() { 
    var data = []; 

    var addData = function (d) { 
     data = d; 
    }; 

    var getData = function() { 
     return data; 
    }; 

    return { 
     addData: addData, 
     getData: getData 
    }; 
}) 
+1

Possiamo avere uno sguardo a 'definizione myService'? Aggiunto anche il tuo html –

+0

@RahilWazir. l'utilizzo dei dati è in effetti in ng-table params –

+0

Sarebbe bello se includessi il tuo html, così sapremo come hai usato i controller. –

risposta

6

Se si desidera che il controller attenda fino a quando non si ottiene una risposta dall'altro controller. Puoi provare a usare l'opzione $broadcast in angularjs.

Nel pagecontroller, devi trasmettere il tuo messaggio "dataAdded" e nel pageubcontroller devi attendere il messaggio usando $ scope. $ On e quindi elaborare la funzione "getData".

si può provare qualcosa di simile:

angular.module('appRoot.controllers') 
.controller('pageController', function (myApiService, myService,$rootScope) { 
    // load data from API call 
    var data = myApiService.getData(); 

    // Write data into service 
    myService.addData(data); 
    $rootScope.$broadcast('dataAdded', data); 
}) 

.controller('pageSubController', function (myService,$rootScope) { 
    // Read data from service 
    $scope.$on('dataAdded', function(event, data) { 
     var data = myService.getData(); 
    } 

    // Do something with data.... 
}) 
+0

Grazie - Avrò un gioco con questo e ti faccio sapere –

+0

Questo era proprio quello di cui avevo bisogno - un evento globale a cui posso collegarmi. Grazie! –

2

vorrei cambiare il vostro servizio per restituire una promessa per i dati. Quando viene richiesto, se i dati non sono stati impostati, è sufficiente restituire la promessa. Più tardi, quando l'altro controller imposta i dati, risolvi le promesse precedenti con i dati. Ho usato questo modello per gestire i risultati dell'API di caching in modo tale che i controllori non sappiano o si preoccupino se ho recuperato i dati dall'API o ho appena restituito i dati nella cache. Qualcosa di simile a questo, anche se potrebbe essere necessario mantenere una serie di promesse in sospeso che devono essere risolte quando i dati vengono effettivamente impostati.

+0

Grazie per la risposta, anche se non sto effettuando la chiamata api dal servizio, semplicemente usandola per memorizzare alcuni dati. Non è un approccio consigliato? –

+0

Non sembra OP inviare alcuna richiesta sul lato server per recuperare i dati. È solo una semplice assegnazione di dati alle proprietà. –

+0

Mi manca qualcosa o la chiamata a '$ timeout' è ridondante? Dovresti essere in grado di chiamare "deferred.resolve (factory.item)" e restituire la promessa. –