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代码>在第二行-如果它改变了什么,请告诉我