如何在ngInfiniteScroll(AngularJS)中设置节流参数

时间:2017-09-01 14:38:03

标签: javascript angularjs cordova infinite-scroll nginfinitescroll

在我的Angular应用程序中,我使用ng-infinite-scroll允许用户在此处使用插件连续滚动其“新闻Feed” - https://sroze.github.io/ngInfiniteScroll/documentation.html

在我的桌面上运行正常,但是当在Android设备上的Cordova应用程序中运行时,无限滚动会占用大量CPU资源。我试图使用THROTTLE_MILLISECONDS选项每隔x秒仅处理滚动事件(这应该会提高性能并使滚动不那么生涩)。

我的模块定义如下:

var abcdDirectives = angular.module('abcdDirectives', []);
var abcdServices = angular.module('abcdServices', [ 'ngResource', 'infinite-scroll', 'ngCookies']);

abcdApp.value('THROTTLE_MILLISECONDS', 10000);

我正在尝试使用上面的行来如下限制,但它似乎没有任何区别。

在我的模板视图中,我有以下代码:

<div 
  infinite-scroll="tabs[tabIndex].FeedService.loadFeed(false, tabs[tabIndex].FeedService.filters, search.text, search.dateFrom, search.dateTo)"
  infinite-scroll-disabled="tabs[tabIndex].FeedService.busy || tabs[tabIndex].FeedService.noMoreResults || !tabs[tabIndex].active || tabs[tabIndex].FeedService.initialLoad"
  infinite-scroll-distance="1"
  infinite-scroll-immediate-check="false" >
<div ng-repeat="interaction in getTabItems(tabIndex) track by $index">

在js控制器中,这是我的getTabItems函数

$scope.getTabItems = function (index) {
    if (angular.isDefined($scope.tabs[index].FeedService)) {
        console.log('getTabItems'); // this is being output to the console log over and over again extremely quickly
        return $scope.tabs[index].FeedService.items;
    }
}

我可以在控制台日志中看到的控制台日志中的控制台日志正在反复输出太多&amp;我试图限制这个函数被调用但我使用的油门声明似乎没有区别?我的代码

我做错了什么

- 版本 -

Angular 1.3.0 ng-infinite-scroll 1.2.2

1 个答案:

答案 0 :(得分:1)

应在将使用THROTTLE_MILLISECONDS的模块上设置

ngInfiniteScroll。因此,对于您的情况,它应该设置在abcdServices上,就像这样。

var abcdDirectives = angular.module('abcdDirectives', []);
var abcdServices = angular.module('abcdServices', [ 'ngResource', 'infinite-scroll', 'ngCookies']);

abcdServices.value('THROTTLE_MILLISECONDS', 10000);

但在我看来,价值应该是它的直接父母(使用ngInfiniteScroll)。像这样。

angular.module('yourApp.controllers', [])
.value('THROTTLE_MILLISECONDS', 5000)
.controller('controllerWhichUseInfiniteScroll',
['$scope',
    function ($scope) {
    }
]);
如果在infinite-scroll的新结果完成之前将tabs[tabIndex].FeedService.loadFeed标志设置为true,则

infinite-scroll-disabled事件函数(在您的情况下为tabs[tabIndex].FeedService.loadFeed)将以无限循环运行。

要解决此问题,请使用infinite-scroll-disabled在下一个摘要循环中将$timeout标志设置为true。这意味着只有在渲染结果完成时,标志才会为真。见下文......

<div 
  infinite-scroll="getDataFromApi()"
  infinite-scroll-disabled="loaded"
  infinite-scroll-distance="1">
    <div ng-repeat="data in dataList">

-

angular.module('yourApp.controllers')
.controller('yourController',
['$scope', '$timeout', 'apiDataService',
    function ($scope,  $timeout, apiDataService) {
        $scope.dataList = [];

        $scope.getDataFromApi = function () {
            $scope.loaded = false;
            apiDataService.getData()
                .then(function(result) {
                    $scope.dataList = result.data;

                    //Set loaded to true after rendering new results is finished.Otherwise it will make infinite api calls.
                    $timeout(function (){
                        $scope.loaded = true;
                    });
                });
        }
    }
]);

另外值得指出的是,出于性能原因,getTabItems()不应该用于绑定html中的数据。因为angular会将它放在摘要循环中以进行变化检测,无论是否使用ngInfiniteScroll,都会调用很多次。