【问题标题】:Boolean in view is true but in controller false angularJS布尔值在视图中为真,但在控制器中为假
【发布时间】:2017-12-25 21:56:21
【问题描述】:

在父范围(包含整个 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> 那样在视图中显示真/假,它也可以正常工作。

在一个控制器中,我想在不在视图中的控制器中使用这个布尔值。所以我做if($scope.authentication.isAuth){if($scope.$parent.authentication.isAuth){(我都试过了),即使<p>{{$parent.authentication.isAuth}}</p> 在我使用这个条件的控制器的视图中显示为真,这种情况也会发生。

原来如此

<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" 字符串。

【问题讨论】:

  • else 中的代码真的很重要吗?好的。我编辑。
  • 你在两个条件下打印相同的值,你怎么说它去else部分?
  • 因为它控制台输出 false 不是 true
  • 我试过了,它现在正在安慰假和“假”字符串,看看。
  • console.log(typeof $scope.authentication.isAuth);返回布尔值。

标签: angularjs scope parent


【解决方案1】:

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

【讨论】:

  • 在这个场景中 $watch 进行布尔值更改不会影响我的应用性能吗?
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多