2013-08-14 13 views
12

mam usługę, która pobiera niektóre dane klienta z mojego serwera:angularjs dzielenie danych pomiędzy kontrolerami

app.factory('clientDataService', function ($http) { 
    var clientDataObject = {}; 
    var cdsService = { 
     fetch: function (cid) { 
      //$http returns a promise, which has a then function, which also returns a promise 
      var promise = $http.get('/clients/stats/' + cid + '/').then(function (response) { 
       // The then function here is an opportunity to modify the response 
       console.log(response); 
       // The return value gets picked up by the then in the controller. 
       clientDataObject = {'data': response.data, 'currentClientID': cid}; 
       return clientDataObject; 
      }); 
      // Return the promise to the controller 
      return promise; 
     } 
    }; 
    return cdsService; 
}); 

Następnie w jednym kontrolerze robię:

//get stats 
clientDataService.fetch($scope.id).then(function (response) { 
    $scope.client_data = { 
     'statistics': response.data 
    } 
}); 

Który wszystko działa bardzo dobrze. Jednak staram się zrobić zegarek z innego regulatora na tę usługę aktualizacji to zakres, gdy zmiany danych, a następnie konieczności ponownego inauguracją żądania http:

$scope.$watch('clientDataService.clientDataObject', function (cid) { 
    alert(cid); 
}); 

Ja tylko ostrzeganie dla teraz, ale nigdy się nie uruchamia. Kiedy strona ładuje się początkowo, alarmuje "nieokreślony". Nie mam żadnych błędów w konsoli i wszystkie wtryski $ są w porządku, ale nigdy nie wydaje się, aby rozpoznać, że dane uległy zmianie w usłudze. Czy robię coś złego na zegarku?

Dziękujemy Ben

Odpowiedz

13

clientDataService.clientDataObject nie jest częścią zakresu kontroler, więc nie można obserwować zmiany na tym obiekcie. Musisz wprowadzić $ rootScope do swojej usługi, a następnie rozesłać zmiany do zakresów kontrolerów.

app.factory('clientDataService', function ($rootScope, $http) { 
    var clientDataObject = {}; 
    var cdsService = { 
     fetch: function (cid) { 
      var promise = $http.get('/clients/stats/' + cid + '/').then(function (response) { 
       // The then function here is an opportunity to modify the response 
       console.log(response); 
       // The return value gets picked up by the then in the controller. 
       clientDataObject = {'data': response.data, 'currentClientID': cid}; 
       $rootScope.$broadcast('UPDATE_CLIENT_DATA', clientDataObject); 
       return clientDataObject; 
      }); 
      // Return the promise to the controller 
      return promise; 
     } 
    }; 
    return cdsService; 
}); 

Następnie w sterowniku można słuchać na zmianę, używając:

$scope.$on('UPDATE_CLIENT_DATA', function (event, clientDataObject) { }); 
+0

wielkie dzięki .. pracował jak czar –

9

Inne podejście może być:

  1. zdefiniować nową usługę

    app.factory('DataSharingObject', function(){ 
        return {}; 
    } 
    
  2. włączenia ten nowy ser wice w kontrolerze, gdzie chcemy zapisać dane

    app.factory('clientDataService', function ($http, DataSharingObject) { 
        DataSharingObject.sharedata = ..assign it here 
    } 
    
  3. zawierające tę nową usługę w kontrolerze, gdzie chcemy uzyskać dostęp do danych

    app.factory('clientReceivingService', function ($http, DataSharingObject) { 
        ..use it here... = DataSharingObject.sharedata 
    } 
    
+1

jako zauważyłeś, pociski i formowanie kodu nie współgrają ze sobą: ten ostatni potrzebuje 8 wiodących spacji (w porównaniu do normalnego 4) – kleopatra

Powiązane problemy