【问题标题】:$state.reload doesn't refresh view$state.reload 不刷新视图
【发布时间】:2017-05-20 12:34:40
【问题描述】:

我有以下代码:

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 就可以了。 此外,视图实际上确实会重新加载数据。

这里有什么问题..?

【问题讨论】:

  • 这对我不起作用,即使我将继承功能更改为true..
  • 尝试删除 $scope.$apply() - 我看不出它有什么用,因为您使用的是原生 $timeout 服务
  • 你是对的,在这种情况下没有任何区别。但是,它也不能解决问题。
  • 尝试将$stateParams 注入控制器,并使用此功能:$scope.reload = function() { $scope.reloading = true; $state.transitionTo($state.current, $stateParams, {reload: true, inherit: false, notify: false}).then(function() { $timeout($scope.reloading = false;), 2000}); } 也 - 在第二行评论 $scope.reloading = false ; - 如果它改变了任何内容,请告诉我

标签: javascript angularjs scope


【解决方案1】:

$state.reload()

的别名
$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();
    }
}]);

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

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

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 2018-04-14
    • 2016-12-25
    • 1970-01-01
    • 2012-08-22
    • 2019-11-29
    • 2012-02-13
    • 2014-07-11
    • 2011-09-03
    相关资源
    最近更新 更多