我有一个在ng-view之外的NavbarCtrl。我有一个登录控制器,它与服务进行通信以使用户登录。一旦用户登录,我希望Navbar使用用户的电子邮件地址进行更新。但是对于我的生活,一旦用户登录,我似乎无法使用加载到我的“Auth”服务中的数据来更新Navbar范围。
这是我的主要index.html:
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="#">Brim</a>
<div class="pull-right" ng-controller="NavbarCtrl">
<div ng-click="refresh()">hello</div>
{{ user.email }}
</div>
</div>
</div>
</div>
<div class="container" ng-view>
我的服务:
.factory('Auth', function($resource) {
var authenticated = false;
var user = {};
return {
isAuthenticated: function () {
return authenticated;
},
getUser: function() {
return user;
},
login: function(loginUser, callback) {
user = {email:'email@email.com'}
authenticated = true;
callback(true);
//actual code for logging in taken out for brevity
}
}
})
我的Login和Navbar控制器:
function LoginCtrl($scope, $location, Auth) {
$scope.login = function() {
Auth.login($scope.user, function(success) {
if(success) $location.path('/dashboard');
//console.log(Auth.getUser())
});
}
}
function NavbarCtrl($scope, Auth) {
//thought this should work
$scope.user = Auth.getUser();
//experimenting unsuccessfully with $watch
$scope.$watch(Auth.isAuthenticated(),function () {
$scope.user = Auth.getUser()
})
//clicking on a refresh button is the only way I can get this to work
$scope.refresh = function() {
$scope.user = Auth.getUser()
}
}
从我的研究中我会想到$ scope.user = Auth.getUser();会工作,但事实并非如此,我完全不知道如何在用户登录时更新我的Navbar。提前感谢您的帮助。
答案 0 :(得分:54)
更新:嗯,您每天都会学到新的东西......只需删除()
即可观看功能的结果:
$scope.$watch(Auth.isAuthenticated, function() { ... });
在这个小提琴中,注意当$scope.isAuthenticated
的值发生变化时,'watch1'和'watch3'如何触发第二次。
因此,这是监视对服务上定义的原语值的更改的一般技术:
要注意对服务中定义的对象或数组的更改:
user = ...;
相反,请执行以下操作:{ {1}}或者:angular.copy(newInfo, user)
示例:
user.email = ...
原始答案:
要观察函数的结果,您需要传递$ watch一个包含该函数的函数:
$scope.user = Auth.getUser();
// Because user is a reference to an object, if you change the object
// in the service (i.e., you do not reassign it), $scope.user will
// likewise change.
$scope.$watch('user', function(newValue) { ... }, true);
// Above, the 3rd parameter to $watch is set to 'true' to compare
// equality rather than reference. If you are using Angular 1.2+
// use $watchCollection() instead:
$scope.$watchCollection('user', function(newValue) { ... });
Fiddle。在小提琴中,注意当$scope.$watch( function() { return Auth.isAuthenticated() }, function() { ... });
的值发生变化时,只有'watch3'触发第二次。 (它们最初都是触发器,作为$ watch初始化的一部分。)
答案 1 :(得分:0)
尝试更改
$ scope。$ watch(Auth.isAuthenticated(),function(){ $ scope.user = Auth.getUser() })
到
$ scope。$ watch(Auth.isAuthenticated(),function(){ $ scope.user = Auth.getUser() },真实)
查看AungularJs $watch documentation以获得详细解释,默认值为false,这意味着Angular通过引用检测第一个参数值的变化,而传递true意味着检查是通过相等来完成的。作为函数的参数,检查总是返回false,因为对函数的引用始终是相同的。
答案 2 :(得分:0)
使用user
作为变量名通常不是一个好主意。我曾经改变过它currentUser
一切都对我有用。