在父作用域(包装整个webapp的外部作用域)中,如果您已登录,我将定义布尔变量。
$localForage.getItem('authorization')
.then(function(authData) {
if(authData) {
$scope.authentication.isAuth = true;
//token is added in http interceptor
} else {
$scope.authentication.isAuth = false;
}
}, function(){
console.log("error with getting authorization localForage after refresh");
}
);
它基本上是正确的。现在,我可以使用ng-if="$parent.authentication.isAuth"
基于此布尔值构建UI。我也可以在视图中显示true / false,如<p>{{$parent.authentication.isAuth}}</p>
,它也正常工作。
在一个控制器中,我想在控制器内使用此布尔值而不是在视图中。所以我做if($scope.authentication.isAuth){
或if($scope.$parent.authentication.isAuth){
(我试过两个),即使在我使用此条件的控制器<p>{{$parent.authentication.isAuth}}</p>
显示为真时,这个条件也会转到其他地方。
所以它
<div ng-controller="ctrl">
<p>{{$parent.authentication.isAuth}}</p>
</div>
在段落中显示 true ,在名为ctrl
的控制器中显示此条件if($scope.authentication.isAuth){
转到其他...为什么会出现这种奇怪的行为?
if($scope.authentication.isAuth){
console.log($scope.authentication.isAuth);
console.log('true');
} else {
console.log($scope.authentication.isAuth);
console.log('false');
}
它console.log
false和“false”字符串。
答案 0 :(得分:1)
当您设置值async($localForage.getItem('authorization').then ...)
时,它将首先false
,然后在异步操作完成后将其设置为true
。您的视图会相应地更新值 - 每当它发生变化时 - 这就是你说它在视图中显示true
的原因。它将首先false
,并在几毫秒后变为true
。你不一定会看到它,但它仍然发生。console.log
在异步更改发生之前运行,并且由于if > else
只运行一次,它只会在变量设置为{{1}之前记录变量的状态}}