Angular JS ngInfiniteScroll с LimitTo

Използвам ngInfiniteScroll ng-module за моята пагинация. Когато превъртам страницата надолу, добавям 20 записа към моята таблица с данни. Правейки това, аз всъщност изпълнявам http заявка всеки път („не е добре за производителността).

Правих някои изследвания и се натъкнах на добавяне на LimitTo с ngInfiniteScroll. Не съм сигурен как да приложа това. Може ли някой да ми даде някакви предложения.

   <table infinite-scroll='tF.loadMore()' infinite-scroll-disabled='tF.isBusy' infinite-scroll-distance='3' class="responsive">
            <thead>
                <tr>
                    <th>FIRST NAME</th>
                    <th>LAST NAME</th>
                    <th>USERNAME</th>
                    <th>EMAIL</th>
                    <th>CREATED DATE</th>
                    <th>STATUS</th>
                    <th>IS ONLINE</th>
                    <th>ACTIONS</th>
                </tr>
            </thead>
            <tbody>
                <tr ng-repeat="item in tF.items | filter:searchFilter">
                    <td>{{item.FirstName}}</td>
                    <td>{{item.LastName}}</td>
                    <td>{{item.Username}}</td>
                    <td>{{item.Email}}</td>
                    <td>{{item.CreatedDate | date:'medium'}}</td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
            </tbody>
            <tfoot ng-show='tF.isBusy'>
                <tr>
                    <td colspan="9"><spinner show="tF.isBusy" /><span class="bold">{{tF.status}}</span> </td>
                </tr>
            </tfoot>
        </table>

/**** CONTROLLER.JS *****/

    var vm = this;
    var page = 0;
    vm.items = [];
    vm.isBusy = false;

    vm.loadMore = function ()
    {
        if(vm.isBusy) return;
        vm.isBusy = true;

        userService.GetAllRecords(page)
        .success(function (data)
        {
            var results = data;

            for (var i = 0; i < results.length; i++)
            {
                vm.items.push(results[i]);
            }

            page++;
            vm.isBusy = false;

        }.bind(vm))
        .error(function (error)
        {
            vm.status = 'Error retrieving data! ' + error.message;
        })
        .finally(function ()
        {
            vm.isBusy = false;
        });
    }

person Erkan Demir    schedule 29.05.2015    source източник
comment
Ако не искате да зареждате нови данни всеки път, тогава защо да използвате безкрайно превъртане? Каква е твоята цел?   -  person devqon    schedule 29.05.2015
comment
Искам да зареждам нови данни всеки път. Въпреки това се чудех дали има алтернативен начин за зареждане на данните, вместо да извиквам http заявка всеки път, когато превъртам. напр. заредете всички данни веднъж, когато използвате филтъра limitTo, за да добавите данните   -  person Erkan Demir    schedule 29.05.2015
comment
Да, можете да заредите всички данни наведнъж и да добавите части, докато превъртате. Но наистина мисля, че http заявка е това, което бихте искали с безкрайно превъртане   -  person devqon    schedule 29.05.2015
comment
Не можех ли просто да извикам http заявка веднъж и да заредя всички данни в масив. след това използвайте limitTo filter, за да добавите напр. + 20 записа всеки път, когато превъртам?   -  person Erkan Demir    schedule 29.05.2015


Отговори (2)


Можете да заредите всички данни веднъж и да добавите части, докато превъртате:

var vm = this;
var page = 0;
vm.currentItems = [];
var allData = [],
    step = 10;

vm.loadData = function ()
{
    userService.GetAllRecords(page)
    .success(function (data)
    {
        allData = data;
        vm.loadMore(); // Set first 10 items
    })
    .error(function (error)
    {
        vm.status = 'Error retrieving data! ' + error.message;
    });
}

vm.loadMore = function () {
    // Add more items to the currentItems
    vm.currentItems = vm.currentItems.concat(allItems.slice(page*step, step));
    page++;
}

vm.loadData();

Но зависи от това какво се опитвате да постигнете защо искате това. Ако през повечето време потребителите трябва да видят само първите 10 елемента, тогава бих препоръчал да правите http заявка всеки път, когато искате да заредите повече. Ако потребителят обикновено превърта през всички елементи, тогава зареждането на всички данни наведнъж може да е това, което искате.

person devqon    schedule 29.05.2015
comment
Причината, поради която искам да направя http заявката веднъж, се дължи на това, че имам филтър за търсене и можете да филтрирате само по наличните записи, показващи не целия списък с данни. @devqon - person Erkan Demir; 30.06.2015
comment
Да, тогава можете напълно да го направите, но ако имате хиляди записи, това не би било добра идея. Винаги можете да направите филтриране от страна на сървъра с търсене - person devqon; 30.06.2015
comment
Вероятно ще имам милион записи. Какво би било по-добро решение? @devqon - person Erkan Demir; 01.07.2015

Самият аз съм използвал този модул в няколко приложения и по този начин бихте ограничили обаждането да се изпълнява само веднъж, докато данните ви бъдат върнати.

js код

vm.isBusy = false;

vm.loadMore = function() {
    vm.isBusy = true;

    userService.GetAllRecords(page).success(function(data) {
        var results = data;

        for (var i = 0; i < results.length; i++) {
            vm.items.push(results[i]);
        }

        page++;
        vm.isBusy = false;
    });
}

шаблонен код

<div infinite-scroll="loadMore()" infinite-scroll-distance="0" infinite-scroll-disabled="isBusy"></div>

-

Това е кодът, който написах последния път, когато използвах този модул.

<div infinite-scroll="loadMoreArticles()" infinite-scroll-distance="0" infinite-scroll-disabled="loadingArticles"></div>

$scope.loadingArticles = false;

$scope.loadMoreArticles = function() {
    $scope.loadingArticles = true;

    return articlesFactory.getArticles($stateParams.feedType || 'feed', $stateParams.feed, lastArticle.id).then(function(data) {
        $scope.articles = _.union($scope.articles, data);
        if (data.length > 0) {
            $scope.loadingArticles = false;
        }
    });
};
person Joshua Kelly    schedule 29.05.2015
comment
Хей, Джошуа, каква е разликата между твоя пост и моя оригинален код? - person Erkan Demir; 29.05.2015
comment
tF.loadMore() / tF.isBusy. Без да вижда останалата част от кода ви, tF няма препратка. - person Joshua Kelly; 29.05.2015
comment
tF е моята конвенция за именуване. Използвам ControllerAS: в състоянието на моя ui-рутер - person Erkan Demir; 29.05.2015