Я играю с AngularJS и пытаюсь создать очень простое приложение для учебных целей, но у меня возникла проблема.
Я использую Kinvey BAAS. Итак, это то, что я пытаюсь сделать:
'
.controller('LoginController', [
'$scope',
'$location',
'users',
function ($scope, $rootScope, $location, users) {
$scope.login = function login() {
users.login($scope.user)
.then(function (loggedInUser) {
$location.path('/home');
console.log(loggedInUser);
}, function (error) {
console.log(error);
});
}
}
])
Идея проста. Используйте службу для входа пользователя в систему. Затем перенаправьте его на домашнюю страницу (/home).
'
.factory('users', [
'$http',
'$q',
'$cookies',
'$location',
'BASE_URL',
'APP_KEY',
'APP_SECRET',
function ($http, $q, $cookies, $location, BASE_URL, APP_KEY, APP_SECRET) {
var user = undefined;
function login(user) {
var deferred = $q.defer();
// Get the user information.
$http.post(BASE_URL + 'user/' + APP_KEY + '/login', {
username: user.username,
password: user.password
})
.then(function (response) {
_preserveUserData(response.data);
deferred.resolve(response);
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
}
function _preserveUserData(data) {
var authToken = data._kmd.authtoken;
$cookies.put('authToken', authToken);
user = data;
}
function isLogged() {
if !! (user || $cookies.get('authToken'));
}
function getLoggedUser() {
var deferred = $q.defer();
if (user) {
deferred.resolve(user);
} else if ($cookies.get('authToken')) {
var authToken = $cookies.get('authToken');
$http.defaults.headers.common.Authorization = 'Kinvey ' + authToken;
$http.get(BASE_URL + 'user/' + APP_KEY + '/_me')
.then(function (response) {
user = response.data;
deferred.resolve(response);
}, function (error) {
deferred.reject(error);
});
} else {
deferred.reject('No logged user.');
}
return deferred.promise;
}
return {
login: login,
isLogged: isLogged,
getLoggedUser: getLoggedUser
};
}
]);
У меня также есть главный контроллер (main.controller.js). MainController обертывает весь контент с помощью div(), для привязки к сфере действия некоторого глобального материала... например, текущего пользователя.
'
.controller('MainController', [
'APP_TITLE',
'$scope',
'users',
function (APP_TITLE, $scope, users) {
// A place to store some more-global stuff.
$scope.appTitle = APP_TITLE;
$scope.user = undefined;
if (users.isLogged()) {
users.getLoggedUser()
.then(function (loggedUser) {
$scope.user = loggedUser.data;
}, function (error) {
console.log(error);
});
}
}
])
Теперь это index.html (где главный контроллер и ng-view):
<body>
<div ng-controller="MainController" ng-cloak>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#!/">{{appTitle}}</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="#!/home">Home</a></li>
<li><a href="#!/favorites">Favorites</a></li>
<li><a href="#!/users">Users</a></li>
</ul>
<ul class="nav navbar-nav navbar-right" ng-if="user">
<li class="dropdown">
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{user.username}}<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="javascript:;">Links</a></li>
<li><a href="javascript:;">Edit Profile</a></li>
<li role="separator" class="divider"></li>
<li><a href="javascript:;">Logout</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<div ng-view>
</div>
</div>
И это home.html (где должно отображаться имя пользователя):
<div class="container">
<h2>Hello, <span ng-if="user">{{user.username}}</span></h2>
</div>
Дело в том, что когда пользователь регистрируется, я сохраняю файл cookie и перенаправляю зарегистрированного пользователя... но MainController не регистрирует зарегистрированного пользователя (он никогда не входит в часть if (users.isLogged())). Я должен обновиться, чтобы увидеть имя пользователя.
Любые рекомендации по решению этой проблемы будут удобны. Также будут высоко оценены качество кода и общие рекомендации по улучшению кода.
Заранее спасибо!
Борислав.
users
должны быть сервисом, а не фабрикой... служба создаст единый общий экземпляр, фабрика - это новый экземпляр для каждого контроллера.