布尔值在视图中为真但在控制器中为假 angularJS

Boolean in view is true but in controller false angularJS

在父作用域(包裹整个 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。我也可以在视图中像 <p>{{$parent.authentication.isAuth}}</p> 那样显示 true/false,它也可以正常工作。

在一个控制器中,我想在不在视图中的控制器内部使用这个布尔值。所以我做 if($scope.authentication.isAuth){if($scope.$parent.authentication.isAuth){ (我都试过了)并且即使 <p>{{$parent.authentication.isAuth}}</p> 鉴于我正在使用此条件的控制器显示为真,此条件也会转到 else。

原来如此

<div ng-controller="ctrl">
    <p>{{$parent.authentication.isAuth}}</p>
</div>

在名为 ctrl 的段落和控制器中显示 true 这种情况 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" 字符串。

当您设置值 async ($localForage.getItem('authorization').then ...) 时,它将首先设置为 false,然后可能会在异步操作完成后设置为 true。您的视图会更新相应的值 - 每次它改变 - 这就是为什么你说它在视图中显示 true。它将首先显示 false,几毫秒后将变为 true。你不不一定会看到,但它仍然会发生。console.log 在异步更改发生之前是 运行,并且由于 if > else 仅 运行 一次,它只会记录变量设置为 true.

之前的状态