Угловой 1.3.9 | Служба не обновляется в контроллере 1 при изменении в контроллере 2

заранее спасибо как всегда. Я новичок в Angular и пытаюсь учиться, создавая todoapp из учебника, который постепенно усложняется.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, чтобы понять, как лучше всего установить глобальную переменную isLoggedIn, которая будет обновляться, когда пользователь входит в систему через паспорт, и состояние может быть передано между контроллерами.

Вот мой код:

var todoApp = angular.module('todoApp', []);

todoApp.service('TodoFactory', function() {

this.isLoggedInGlobal = false;

});



todoApp.controller('mainController', ['$scope', '$http', 'TodoFactory', function($scope, $http, TodoFactory) {
    $scope.formData = {due: new Date()};;
    $scope.isLoggedInGlobal = TodoFactory.isLoggedInGlobal;
    $scope.todoData = {deleted: false};

        $scope.getUserTodos = function() {
        $http.get('/api/todos/users')
            .success(function(data) {
              console.log(data)
                $scope.todos = data;
                $scope.isLoggedInGlobal = true;
            })
            .error(function(data) {
                console.log('Error: ' + data);
            });
          }

    // when submitting the add form, send the text to the node API
    $scope.createTodo = function() {
        $http.post('/api/todos', $scope.formData)
            .success(function(data) {
                $scope.formData = {}; // clear the form so our user is ready to enter another
                //$scope.todos = data; no longer needed in favor of the below function
                $scope.getUserTodos();
                console.log(data);
            })
            .error(function(data) {
                console.log('Error: ' + data);
            });
    };

    // delete a todo after checking it
    $scope.deleteTodo = function(id) {
        $http.delete('/api/todos/' + id)
            .success(function(data) {
              //$scope.todos = data; no longer needed in favor of the below function
              $scope.getUserTodos();
                console.log(data);
            })
            .error(function(data) {
                console.log('Error: ' + data);
            });
    };

        $scope.markComplete = function(id) {
        $http.get('/api/todos/complete/' + id)
            .success(function(data) {
              $scope.deleted = true;
              //$scope.todos = data; no longer needed in favor of the below function
              $scope.getUserTodos();
                console.log(data);
            })
            .error(function(data) {
                console.log('Error: ' + data);
            });
    };

  }]);

todoApp.controller('userController', ['$scope', '$http', 'TodoFactory', function($scope, $http, TodoFactory) {
	$scope.loginData = {username: '[email protected]', password: 'Vb578Vb578!'};
    $scope.welcome = "Hello "
    $scope.isLoggedInGlobal = TodoFactory.isLoggedInGlobal;

    // Auth Functions via passport.
        $scope.loginUser = function() {
        $http.post('/api/users/login', $scope.loginData)
            .success(function(data) {
                $scope.loginData = {}; // clear the form so our user is ready to enter another
                $scope.user = data;
                console.log($scope.isLoggedInGlobal);
                console.log(TodoFactory.isLoggedInGlobal);
                $scope.isLoggedInGlobal = true;
                TodoFactory.isLoggedInGlobal = true;
                console.log($scope.isLoggedInGlobal);
                console.log(TodoFactory.isLoggedInGlobal);
                console.log(data);
                $scope.getUserTodos()
              })

            .error(function(data) {
                console.log('Error: ' + data);
            });

    };

  • Вы можете видеть, где я внедряю службу в контроллеры и устанавливаю ее как переменную области видимости.
  • КОГДА функция входа в систему вызывается в userController, переменная $scope пользовательского контроллера обновляется до значения true... переменная mainController не обновляется.
  • Конечно, есть обходной путь, обновляя переменную области видимости в mainController... но это исключает необходимость наличия глобальной переменной.
  • Я также попробовал простую фабрику, возвращающую как простую переменную, так и другой способ в качестве функции:

todoApp.factory('mainFactory', function($scope) {

  var isLoggedInGlobal = false;
  return isLoggedIn;
});

  • Я также немного сбит с толку, потому что дважды перечисляю «TodoFactory». Когда я беру первую ссылку из TodoFactory, непосредственно перед тем, как передать ее как функцию, я получаю неопределенную ошибку.

Любая помощь будет принята с благодарностью.


person Taylor Ackley    schedule 24.03.2015    source источник
comment
Самое простое и чистое решение — здесь   -  person Sarpdoruk Tahmaz    schedule 03.12.2015


Ответы (1)


Вместо того, чтобы иметь свойство в службе, я бы использовал геттер и сеттер:

todoApp.service('loginService', function() {
    var _loggedIn;

    this.setLoggedIn = function (val) {
        _loggedIn = val;
    };

    this.isLoggedIn = function () {
        return _loggedIn;
    };
});

В ваших контроллерах, вместо того, чтобы использовать переменные области видимости, вы затем вызываете loginService.isLoggedIn(), чтобы проверить, вошел ли кто-то в систему, и loginService.setLoggedIn(true), чтобы установить их как зарегистрированных.

В вашем текущем коде $scope.isLoggedInGlobal в ваших контроллерах не является ссылкой на TodoFactory.isLoggedInGlobal. Когда вы присваиваете переменную области видимости, значение копируется. Таким образом, вы должны обновить оба. Они совершенно отдельные.

person Matthew Jaspers    schedule 24.03.2015
comment
Спасибо, Бен. Если я использую ng-switch в шаблоне, как мне сослаться на геттер? Благодарность! - person Taylor Ackley; 26.03.2015
comment
Я бы обернул геттер в функцию, которую можно использовать в ng-switch on: $scope.isLoggedIn = function () { return loginService.isLoggedIn(); } - person Matthew Jaspers; 26.03.2015
comment
Спасибо Бен, а что будет в контроллере правильно? Извините за все вопросы. Это очень полезно. - person Taylor Ackley; 27.03.2015
comment
Без проблем. Да, это пошло бы в контроллере. - person Matthew Jaspers; 27.03.2015