当$ interval调用执行$ route.reload

时间:2017-06-11 23:05:33

标签: angularjs routes setinterval reload ng-view

假装我的应用是新闻阅读器。它刷新每隔X秒获取一次新闻。

您已在页面中间滚动。然后,ng-view自动刷新。

如果我什么也没做,你就会失去你的位置,因为卷轴被踢回到页面顶部。

因此,在刷新之前,我使用服务来记录滚动的数字位置。我刷新。我将滚动重置为旧值。你应该在你的旧滚动位置。不行。

实际发生的是,当我逐步执行代码时,在重新加载期间,ng-div呈现两次。

在屏幕和DOM中,我可以看到" old" ng-view内容丰富。

我同时也可以看到一个新的" ng-view,同名,同样的一切,生活在dom中作为" old"的兄弟姐妹。 NG-视图。

我很震惊,因为我没想到这个周期。

新的ng-view完全没有内容。

我成功提取了滚动位置。我尝试在新div上设置滚动位置,但是当angular使其超出我的控制范围时,新div将被渲染并填充内容 - 并且滚动设置为顶部。我的旧设置被忽略/销毁。

我已经尝试过一段令人尴尬的时间来找到解决" new"的滚动位置的方法。在每次刷新之后,每次尘埃落定后,只有ng-view,但是......

任何提示,提示,技巧,谣言,非常感谢。感谢。

以下是代码的相关摘要:

观点:( ng-view是班级' hog')

    <!--        HEADER      -->
    <img  ng-id='colonade' ng-show="showPageHero"  class='header jumbo' src="components/jumbotron/x.png" />

    <header ng-include="'components/header/header.html'">
    </header>


    <!--        VIEWPORT    - GETS RENDERED TWICE AT ONE POINT  -->
    <div ng-view class="column col-md-11 center-block hog" id="viewport" >
    </div>

    <div class="ng-enter" ng-include="'components/footer/footer.html'">
    </div>

控制器:

app.controller(
    'Controller'    , 
    function($scope, $location, $rootScope, $interval, $route, pane)
    {
        console.log("at Controller");
        var curscroll;

        $rootScope.$on(
            "$locationChangeStart"   , 
            function(event, next, current) 
            {
                console.log("at $locationChangeStart - only the first time");
                //***  Take note when the URL changes.
                $scope.showPageHero = $location.path() === '/'; 

                console.log("at $locationChangeStart - setting interval");

                // Have tried different values for X, from 3,000 to 60,000
                $interval(pane.refreshReroll, X);
            }
        );

    $(window).on('beforeunload', function() {
        console.log('beforeunload');
    });                


    $rootScope.$on("$routeChangeStart", function($currentRoute, $previousRoute) {
        curscroll = pane.scrollLocationGet();
        console.log("at $routeChangeStart, curscroll=" +curscroll);
    });

    $rootScope.$on("$routeChangeSuccess", function($currentRoute, $previousRoute) {
        console.log("at $routeChangeSuccess, about to set scroll to " +curscroll); 
        pane.scrollLocationSet(curscroll);
    });

    $scope.$on('$viewContentLoaded', function(){
          console.log("at $viewContentLoaded, about to set scroll to " +curscroll); 
          pane.scrollLocationSet(curscroll);
    });

    $scope.repeat = pane.scrollLocationGet();

    }
);

服务:

app.service('pane', function($route, $window) {

    // comes here once at start
    console.log('in service pane');
    var _scrollLocation;

    return {
                scrollLocationGet: scrollLocationGet,
                scrollLocationSet: scrollLocationSet,
                refreshReroll: refreshReroll
    };

    function scrollLocationGet(){     
        return angular.element(document.getElementById('viewport')).scrollTop(); 
    }

    function scrollLocationSet(val){
        var hogs=angular.element(document.getElementsByClassName('hog'));
        if (hogs.length > 1){
            // At this point I have TWO ng-views in the DOM
            angular.element(document.getElementsByClassName('hog'))[0].scrollTop = 124;            
            angular.element(document.getElementsByClassName('hog'))[1].scrollTop = 124;
        }


    }

    function refreshReroll() {
        console.log('at refreshReroll - about to reload');
        $route.reload();
    }

});

1 个答案:

答案 0 :(得分:1)

您需要取消路线更改时的$ interval

value=""

RTFD heremore