Служба AngularJS, передающая данные между контроллерами

При использовании службы AngularJS для передачи данных между двумя контроллерами мой второй контроллер всегда получает неопределенное значение при попытке доступа к данным из службы. Я предполагаю, что это связано с тем, что первая служба выполняет $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
Спасибо @ Джош-Петитт. Я все еще получаю неопределенность, но теперь я думаю, что это потому, что на второй странице я перехожу, которая является полным HTML-документом, у меня есть директива ng-app в элементе html. Итак, я предполагаю, что это то, что очищает данные службы? Это звучит правильно? - person AquaLunger; 30.07.2013
comment
Может быть, трудно сказать, не глядя на все приложение. FWIW, вот проект AngularJS, над которым я работал, чтобы научиться. Вы можете покопаться в каталоге app/user и посмотреть, как я это реализовал. Я могу использовать userService на разных страницах. github.com/jpmec/done - person Josh Petitt; 30.07.2013
comment
@user1093077 user1093077 Привет, ты нашел обходное решение для своего решения. У меня такая же проблема: stackoverflow.com/questions/20118335/ - person Siddharth Srivastva; 21.11.2013