заранее спасибо как всегда. Я новичок в 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, непосредственно перед тем, как передать ее как функцию, я получаю неопределенную ошибку.
Любая помощь будет принята с благодарностью.