2013-07-30 10 views
20

Podczas korzystania z usługi AngularJS w celu próby przekazywania danych między dwoma kontrolerami, mój drugi kontroler zawsze otrzymuje wartość nieokreśloną podczas próby uzyskania dostępu do danych z usługi. Zgaduję, że to dlatego, że pierwsza usługa robi $ window.location.href i myślę, że to wyczyszczenie danych w usłudze? Czy istnieje sposób na zmianę adresu URL do nowej lokalizacji i utrzymanie danych w usłudze drugiego kontrolera? Kiedy uruchomię poniższy kod, alert w drugim kontrolerze jest zawsze niezdefiniowany.Usługa AngularJS Przekazywanie danych między kontrolerami

app.js (gdzie są one zdefiniowane)

var app = angular.module('SetTrackerApp', ['$strap.directives', 'ngCookies']); 

app.config(function ($routeProvider) 
{ 
$routeProvider 
    .when('/app', {templateUrl: 'partials/addset.html', controller:'SetController'}) 
    .when('/profile', {templateUrl: 'partials/profile.html', controller:'ProfileController'}) 
    .otherwise({templateUrl: '/partials/addset.html', controller:'SetController'}); 
}); 

app.factory('userService', function() { 
var userData = [ 
    {yearSetCount: 0} 
]; 

return { 
    user:function() { 
     return userData; 
    }, 
    setEmail: function(email) { 
     userData.email = email; 
    }, 
    getEmail: function() { 
     return userData.email; 
    }, 
    setSetCount: function(setCount) { 
     userData.yearSetCount = setCount; 
    }, 
    getSetCount: function() { 
     return userData.yearSetCount; 
    } 
}; 
}); 

logincontroller.js: (Controller 1, który określa wartość w eksploatacji)

app.controller('LoginController', function ($scope, $http, $window, userService) { 

$scope.login = function() { 
    $http({ 
     method : 'POST', 
     url : '/login', 
     data : $scope.user 
    }).success(function (data) { 
     userService.setEmail("foobar"); 
     $window.location.href = '/app' 
    }).error(function(data) { 
     $scope.login.error = true; 
     $scope.error = data; 
    }); 
} 
}); 

appcontroller.js (drugi kontroler próbujący odczytać wartość z usługi)

app.controller('AppController', function($scope, $http, userService) { 

$scope.init = function() {  
    alert("In init userId: " userService.getEmail()); 
} 

}); 

Odpowiedz

27

Określ swój serwis jak ten

app.service('userService', function() { 
    this.userData = {yearSetCount: 0}; 

    this.user = function() { 
     return this.userData; 
    }; 

    this.setEmail = function(email) { 
     this.userData.email = email; 
    }; 

    this.getEmail = function() { 
     return this.userData.email; 
    }; 

    this.setSetCount = function(setCount) { 
     this.userData.yearSetCount = setCount; 
    }; 

    this.getSetCount = function() { 
     return this.userData.yearSetCount; 
    }; 
}); 

Odjazd odpowiedź Duncana tutaj:

AngularJS - what are the major differences in the different ways to declare a service in angular?

+0

Dzięki @ Josh-Petitt. Nadal jestem niezdefiniowany, ale teraz myślę, że to dlatego, że na drugiej stronie I przejścia, która jest pełnym dokumentem HTML, mam dyrektywę ng-app w elemencie HTML. Zgaduję, że to właśnie oczyszcza dane usługi? Czy to brzmi poprawnie? – AquaLunger

+0

Może, trudno powiedzieć bez patrzenia na całą aplikację. FWIW, oto projekt AngularJS, nad którym pracowałem, aby się uczyć. Możesz przeglądać katalog app/user i zobaczyć, jak go zaimplementowałem. Mogę korzystać z userService na różnych stronach. https://github.com/jpmec/done –

+0

@ user1093077 Witam, Czy udało Ci się obejść swoje rozwiązanie? Mam ten sam problem na stronie: http://stackoverflow.com/questions/20118335/angular-dependency-injection-passing-values-between-modules-using-service –

Powiązane problemy