AngularJS carga datos del service

Tengo problemas para get datos de un service poblado en mi opinión. Tengo un service definido como tal

app.factory('nukeService', function($rootScope, $http) { var nukeService = {}; nukeService.nuke = {}; //Gets the list of nuclear weapons nukeService.getNukes = function() { $http.get('nukes/nukes.json') .success(function(data) { nukeService.nukes = data; }); return nukeService.nukes; }; return nukeService; }); 

y mi controller

 function NavigationCtrl($scope, $http, nukeService){ /*$http.get('nukes/nukes.json').success(function(data) { $scope.nukes = data; });*/ $scope.nukes = nukeService.getNukes(); } 

Si uso el $ http.get del controller, los datos se llenan bien, sin embargo, si trato de llamar a los datos del service, no obtengo nada. Entiendo que la consulta es asíncrona, pero me está costando entender cómo rellenar la variable $ scope una vez que se devuelven los datos. Podría usar $ rootscope para transmitir un evento y escucharlo en el controller, pero esta no parece la forma correcta de lograrlo. Realmente agradecería cualquier consejo sobre cómo hacer esto de la manera correcta.

Creo que esto debería resolver tu problema

 app.factory('nukeService', function($rootScope, $http) { var nukeService = {}; nukeService.data = {}; //Gets the list of nuclear weapons nukeService.getNukes = function() { $http.get('nukes/nukes.json') .success(function(data) { nukeService.data.nukes = data; }); return nukeService.data; }; return nukeService; }); function NavigationCtrl($scope, $http, nukeService){ $scope.data = nukeService.getNukes(); //then refer to nukes list as `data.nukes` } 

Este es un problema con la reference de object.

cuando llama a nukeService.getNukes() obtiene una reference a un object a entonces su variable $scope.nukes hace reference a esa location de memory.

Después de la llamada al server remoto cuando configura nukeService.nukes = data; no está cambiando el object a en su lugar está cambiando nukeService.nukes de hacer reference al object a al object b . Pero su $scope.nukes no sabe acerca de esta reasignación y aún apunta al object a .

Mi solución en este caso es pasar un object a con data propiedad y luego solo cambiar la propiedad de datos en lugar de cambiar la reference a a

Esto debería ser el siguiente. Como se menciona en el comentario de NickWiggill, undefined se asignará a nukeService.data si no devolvemos la promise.

 app.factory('nukeService', function($rootScope, $http) { var nukeService = {}; //Gets the list of nuclear weapons nukeService.getNukes = function() { return $http.get('nukes/nukes.json'); }; return nukeService; }); function NavigationCtrl($scope, $http, nukeService){ nukeService.getNukes().then(function(response){ $scope.data = response.data; }); } 

Lo que hago es exponer los datos directamente desde el service, y tengo un método que inicializa estos datos. ¿Qué está mal con esto?

Servicio:

 app.factory('nukeService', function($scope, $http) { var data = {}; data.nukes = []; //Gets the list of nuclear weapons var getNukes = function() { $http.get('nukes/nukes.json').success(function(data) { data.nukes = data; }); }; // Fill the list with actual nukes, async why not. getNukes(); return { data : data // expose more functions or data if you want }; }); 

Controlador:

 function NavigationCtrl($scope, nukeService){ $scope.data = nukeService.data; //then refer to nukes list as `$scope.data.nukes` }