web-dev-qa-db-fra.com

Service AngularJS transmettant des données entre les contrôleurs

Lorsque j'utilise un service AngularJS pour essayer de transmettre des données entre deux contrôleurs, mon deuxième contrôleur reçoit toujours indéfini lorsqu'il essaie d'accéder aux données du service. Je suppose que c'est parce que le premier service fait un $ window.location.href et je pense que cela efface les données du service? Existe-t-il un moyen pour moi de modifier l'URL vers un nouvel emplacement et de conserver les données persistantes dans le service pour le deuxième contrôleur? Lorsque j'exécute le code ci-dessous, l'alerte dans le deuxième contrôleur n'est toujours pas définie.

app.js (où le service est défini)

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: (Contrôleur 1 qui définit la valeur en service)

    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 (deuxième contrôleur essayant de lire la valeur du service)

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

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

});
20
AquaLunger

Définissez votre service comme ceci

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

Découvrez la réponse de Duncan ici:

AngularJS - quelles sont les principales différences dans les différentes façons de déclarer un service en angulaire?

27
Josh Petitt