Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $state.reload不';刷新视图_Javascript_Angularjs_Scope - Fatal编程技术网

Javascript $state.reload不';刷新视图

Javascript $state.reload不';刷新视图,javascript,angularjs,scope,Javascript,Angularjs,Scope,我有以下代码: launch.controller('HeaderController', ['$scope', '$state','$timeout', function($scope, $state, $timeout){ $scope.reloading = false ; $scope.reload = function(){ $scope.reloading = true; $state.reload(); $timeo

我有以下代码:

launch.controller('HeaderController', ['$scope', '$state','$timeout', function($scope, $state, $timeout){
    $scope.reloading = false ;

    $scope.reload = function(){
        $scope.reloading = true;
        $state.reload();
        $timeout(function(){
            $scope.reloading = false;
            $scope.$apply()
        }, 2000);
    }
}]);
以及以下模板:

<img src="assets/img/refresh.svg" ng-class="{'reloading': reloading == true}">

当我不使用
$scope.reload()
时,它会完美地反映在视图中。但是,只要我使用该函数,视图就无法识别正在更改的布尔值。 我已经检查了函数是否正在运行,它确实在运行;在
$state.reload()之后添加
console.log
,效果很好。 此外,视图实际上也会重新加载数据

这里有什么问题?

是的别名

$state.transitionTo($state.current, $stateParams, { 
  reload: true, inherit: false, notify: false 
});
因此您将
$scope.reloading=true
并立即重新加载状态,重置控制器,这样视图就没有时间更改指示器,因为这一切都发生得很快

因此,我建议使用某种标志,允许您使用
sessionStorage
显示可视指示器:

launch.controller('HeaderController', ['$scope', '$state','$timeout', function($scope, $state, $timeout){
    $scope.reloading = sessionStorage.getItem('reloading') === 'true';

    if( $scope.reloading ) { 
        sessionStorage.removeItem('reloading');

        $timeout(function(){
            $scope.reloading = false;
        }, 2000);
    }

    $scope.reload = function(){
        sessionStorage.setItem('reloading', 'true');
        $state.reload();
    }
}]);
我在这里所做的是,当您重新加载页面时,首先在会话中设置重新加载标志,然后重新加载页面。创建控制器时,我通过会话中的值设置
$scope.reloading
$scope.reloading=sessionStorage.getItem('reloading')=='true';
),如果已设置,则从会话中删除标志,并在2秒后隐藏视图中的指示器(使用
$timeout
服务)


仅供参考-angularjs有一个模块,您可以在需要管理应用程序中的存储时使用它

看到了吗?这对我来说不起作用,即使我将继承函数更改为
true
。请尝试删除
$scope.$apply()
-我看不出它有任何用处,因为您使用的是本机
$timeout
服务。您是对的,在这种情况下没有任何区别。但是,它也不能解决问题。尝试将
$stateParams
注入控制器,并使用此函数:
$scope.reload=function(){$scope.reloading=true;$state.transition($state.current,$stateParams,{reload:true,inherit:false,notify:false})。然后(function(){$timeout($scope.reloading=false;),2000});}
同时-注释
$scope.reloading=false在第二行-如果它改变了什么,请告诉我