2013-03-01 13 views
14

Mam problem z pobieraniem danych z usługi do mojego widoku. Mam usługa zdefiniowane jako takiDane obciążenia AngularJS z usługi

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; 
}); 

i mojego kontrolera

function NavigationCtrl($scope, $http, nukeService){ 



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

    $scope.nukes = nukeService.getNukes(); 

} 

Jeśli używam $ http.get od kontrolera danych zapełnia porządku, jednak gdy próbuję zadzwonić dane z usługa, nic nie dostaję. Rozumiem, że kwerenda jest asynchroniczna, ale trudno mi zrozumieć, jak wypełnić zmienną $ scope po zwróceniu danych. Mogę użyć $ rootscope do nadania zdarzenia i posłuchania go w kontrolerze, ale nie wydaje mi się to właściwym sposobem na osiągnięcie tego. Byłbym wdzięczny za wszelkie porady, jak to zrobić w prawidłowy sposób.

Odpowiedz

27

myślę, że to powinno rozwiązać problem

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` 

} 

Jest to problem, z odniesieniem obiektu.

po wywołaniu nukeService.getNukes() otrzymujesz odwołanie do obiektu a, wtedy zmienna $scope.nukes odwołuje się do tej lokalizacji pamięci.

Po zdalnego wywołania serwera po ustawieniu nukeService.nukes = data; nie zmieniają przedmiot a zamiast zmieniasz nukeService.nukes od przedstawieniu przedmiotu a sprzeciwić b. Ale Twój $scope.nukes nie wie o tym ponownym przypisaniu i nadal wskazuje obiekt a.

Moja rozwiązaniem w tym przypadku jest, aby przekazać obiekt a z własności data a potem tylko zmienić właściwość danych zamiast zmieniać odniesienia do a

+0

To działało, ale mogę zapytać, dlaczego? Zakładam, że ma to coś wspólnego z .data będącym kontenerem dla danych json zamiast próbować przekazać go bezpośrednio? Przy okazji, dziękuję za szybką odpowiedź! – jamesamuir

+0

jeśli to działa, proszę zaznaczyć odpowiedź jako zaakceptowaną –

+0

oznaczoną jako odpowiedź. Dziękuję za wyjaśnienie. – jamesamuir

9

To powinno być w następujący sposób. Jak wspomniano w komentarzu NickWiggill, undefined zostanie przypisany do usługi nukeService.data, jeśli nie zwrócimy obietnicy.

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; 
    }); 

    } 
3

Co mogę zrobić, to pokazać dane bezpośrednio z usługi i mieć metodę, która inicjuje te dane. Co jest z tym nie tak?

Usługa:

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 
    }; 
}); 

Kontroler:

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