Итак, я столкнулся с этой проблемой, когда я использую ngView, и у меня есть статичная панель навигации, например:
<div ng-include="'views/nav.html'" ng-controller="NavCtrl"></div>
<div class="container-fluid" ng-view=""></div>
Этот nav.html, панель навигации, отображает определенный набор функций (Вход, Регистрация), если пользователь вышел из системы (используя ng-show), и другие параметры меню, если пользователь вошел в систему. Из-за интенсивного использования текущего user, я поместил эту информацию в $rootScope следующим образом: $rootScope.currentUser
— возвращает объект пользователя, а $rootScope.signedIn
— возвращает логическое значение.
По сути, я хочу отложить загрузку навигационной панели до тех пор, пока $rootScope.signedIn
не будет загружено и либо истинно, либо ложно, а $rootScope.currentUser
является объектом или неопределенным.
Я пытался возиться с созданием обещаний в моих маршрутах app.config, но я не уверен, как я могу вернуть обещание в постоянное состояние просмотра.
Любая помощь приветствуется.
Изменить:
Вот сервис, в котором я транслирую свой логин. Это срабатывает каждый раз, когда пользователь аутентифицируется/входит в систему или каждый раз, когда он выходит из системы:
var authClient = new FirebaseSimpleLogin(refDownload, function(error, user) {
if (error) {
incorrectLogin(error.code);
}
if (user) {
// user authenticated
$rootScope.$broadcast('login');
correctLogin(user.id);
} else {
// user is logged out
$rootScope.$broadcast('logout');
}
});
Эта служба внедряется в контроллер NavCtrl следующим образом:
$scope.isHidden = true;
$scope.$on('login', function() {
console.log('login broadcast');
$scope.isHidden = false;
});
$scope.$on('logout', function() {
console.log('broadcast logout');
$scope.isHidden = true;
});
Шаблон для этого контроллера — nav.html, который выглядит следующим образом:
<div class="col-xs-4 centered" id="nav-hover" ng-show="isHidden">
<ul class="nav navbar-nav">
<li id="nav-login"><a ng-href="#/login"><span class="glyphicon glyphicon-log-in"> Login</span></a></li>
</ul>
</div>
<div class="col-xs-4 centered" id="nav-hover" ng-show="isHidden">
<ul class="nav navbar-nav">
<li id="nav-login"><a ng-href="#/register"><span class="glyphicon glyphicon-edit"> Register</span></a></li>
</ul>
</div>
<div class="col-xs-2 centered" id="nav-hover">
<ul class="nav navbar-nav" ng-hide="isHidden">
<li ng-class="{{ chatCat.active }}"><a ng-href="{{ chatCat.url }}"><span class="{{ chatCat.icon }}"></span></a></li>
</ul>
</div>
Опять же, это представление привязано к NavCtrl. При входе пользователей я использую AuthCtrl следующим образом:
$scope.login = function() {
if ($scope.user !== undefined) {
Auth.login($scope.user);
$location.path('/dexter');
} else {
console.log('nothing entered');
}
};
Когда я пытаюсь войти в систему, навигационное представление не обновляется с новыми значениями, хотя трансляция запускается из службы с «входом в систему».
Служба авторизации:
'use strict';
app.factory('Auth',
function($rootScope, $location, $firebase, $firebaseSimpleLogin, firebaseUrl) {
var refDownload = new Firebase(firebaseUrl + 'housemates');
var sync = $firebase(refDownload);
var ref = sync.$asObject();
var authClient = new FirebaseSimpleLogin(refDownload, function(error, user) {
if (error) {
incorrectLogin(error.code);
}
if (user) {
// 1
// user authenticated
correctLogin(user.id);
} else {
// user is logged out
// $rootScope.signedIn = false;
}
});
var Auth = {
housemates: ref,
changeColor: function(color) {
var id = $rootScope.currentUser.id.toString();
refDownload.child(id).update({ color: color });
$rootScope.currentUser.color = color;
},
create: function(authUser, usr) {
refDownload.child(authUser.id).set({
initials: usr.initials,
email: authUser.email,
password: usr.password,
color: 'Blue',
id: authUser.id,
uid: authUser.uid,
rememberMe: true,
});
},
// 3
findById: function(id) {
refDownload.on('value', function(snapshot) {
var userObject = snapshot.val();
// 4 - sets currentUser
//$rootScope.currentUser = userObject[id];
var currentUser = userObject[id];
Auth.setUser(currentUser);
// $rootScope.signedIn = true;
}, function (error) {
console.log(error);
});
},
login: function(user) {
authClient.login('password', {
email: user.email,
password: user.password,
rememberMe: true
});
},
logout: function() {
delete $rootScope.currentUser;
delete $rootScope.signedIn;
delete $rootScope.error;
return authClient.logout();
},
register: function(user) {
var userSimple = user;
authClient.createUser(user.email, user.password, function(error, user) {
if(!error) {
var userComplex = user;
Auth.login(userSimple);
Auth.create(userComplex, userSimple);
return user;
} else {
console.log(error);
}
});
},
setUser: function(aUser) {
console.log('setuser ran');
$rootScope.currentUser = aUser;
console.log('setUser: ' + $rootScope.currentUser);
},
isLoggedIn: function() {
console.log($rootScope.currentUser);
return ($rootScope.currentUser) ? $rootScope.currentUser : false;
},
};
// 2
function correctLogin(id) {
Auth.findById(id);
}
function incorrectLogin(error) {
alert(error);
$rootScope.error = error;
}
return Auth;
});
$rootScope
. - person Sergiu Paraschiv   schedule 03.10.2014$rootScope
нет вариантов использования, за исключением, может быть, широковещательных передач, и вам также следует избегать их. Служба является постоянной (что-то вроде синглтона), поэтому в$scope.foo = someService.getSomeData();
нет ничего плохого. - person Sergiu Paraschiv   schedule 03.10.2014$rootScope.signedIn
. В этом коде вы также можете$rootScope.userLoaded = false; __load the data__.onSuccessDo: $rootScope.userLoaded = true;
, а затемng-show="userLoaded"
на панели навигации. - person Sergiu Paraschiv   schedule 03.10.2014{{ isHidden }}
в Nav, и вход в систему, похоже, не меняет значение. Однако, когда я щелкаю элемент на панели навигации, значение isHidden обновляется. Мне кажется проблема в контроллере. В моемindex.html
я вызываю навигационный вид и навигационный Ctrl. Но когда открывается страница входа, она использует AuthCtrl, а не NavCtrl. Может ли это быть проблемой? Могу ли я обернуть свои div в index.html вокруг ng-include? Как я могу изменить значение isHidden в области навигации от других контроллеров? Разве он не должен автоматически меняться при входе/выходе из службы? - person Himmel   schedule 03.10.2014