AngularJS услуга, предаваща данни между контролери

Когато използвам услуга AngularJS за опит за предаване на данни между два контролера, вторият ми контролер винаги получава undefined, когато се опитва да получи достъп до данни от услугата. Предполагам, че това е така, защото първата услуга прави $window.location.href и мисля, че това изчиства данните в услугата? Има ли начин да променя URL адреса на ново местоположение и да запазя данните в услугата за втория контролер? Когато стартирам кода под предупреждението във втория контролер винаги е недефиниран.

app.js (където услугата е дефинирана)

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: (Контролер 1, който задава стойност в услугата)

    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 (Вторият контролер се опитва да прочете стойност от услугата)

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

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

});

person AquaLunger    schedule 30.07.2013    source източник


Отговори (1)


Определете услугата си така

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

Вижте отговора на Дънкан тук:

AngularJS - какви са основните разлики в различните начини за деклариране на услуга в angular?

person Josh Petitt    schedule 30.07.2013
comment
Благодаря @Josh-Petitt. Все още ставам недефиниран, но сега си мисля, че е така, защото на втората страница преминавам, което е пълен HTML документ, имам директива ng-app в html елемента. Така че предполагам, че това е изчистването на данните за услугата? Звучи ли правилно? - person AquaLunger; 30.07.2013
comment
Може би е трудно да се каже, без да се разгледа цялото приложение. FWIW, ето един AngularJS проект, върху който работя, за да науча. Може да бръкнете в директорията за приложения/потребители и да видите как съм го внедрил. Мога да използвам userService на различни страници. github.com/jpmec/done - person Josh Petitt; 30.07.2013
comment
@user1093077 Здравей, Заобиколи ли решението си? Имам същия проблем на адрес: stackoverflow.com/questions/20118335/ - person Siddharth Srivastva; 21.11.2013