Lightswitch HTML Client. Итерация по всем элементам коллекции

в 11:28, , рубрики: .net, ASP, javascript, метки: ,

Понадобилось мне в Lightswitch HTML Client перебрать на стороне клиента все элементы коллекции. Не спрашивайте почему — так хочет заказчик.

Основная проблема перебрать все записи коллекции это paging. Если отключить Support paging в настройках экрана, то все становиться очень просто:

    for (var i = 0; i < collection.data.length; i++) 
        MyFunc(collection.data[i]);

Но отключать по-страничную загрузку крайне не рекомендуется. Поиски по единственному вменяемому источнику информации по Lightswitch привели к следующему решению. Мы будем использовать метод loadMore который позволяет подгрузить следующую страницу данных. Чтобы понять, есть ли еще перезагруженные элементы, мы используем свойство коллекции canLoadMore.

Получится следующий код:

function _IterateCollection(collection, recFunction, fromRecord) {
    var i = fromRecord;
    for (; i < collection.data.length; i++) 
        recFunction(collection.data[i]);
    if (collection.canLoadMore) {
        collection.loadMore(true).then(function (result) {
            _IterateCollection(collection, recFunction, i);
        });
    }
};
function IterateCollection(collection, recFunction) {
    _IterateCollection(collection, recFunction, 0);
}

Теперь метод IterateCollection можем задействовать в кнопке:

myapp.BrowseCustomers.MyButtonMethod_execute = function (screen) {
    IterateCollection(screen.Customers, function (rec) {
        console.log(rec);
    });
};

Подводные камни такого метода очевидны, когда данные коллекции прибиндены к элементу управления: для большой коллекции это может привести к out-of-memory. С другой стороны это избавляет вас от написания сложного кода, учитывающего все фильтры, примененные к этому набору данных

Напоследок полезная статья, которая помогла найти такое решение.

Автор: весёлый усач

Источник

Поделиться

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js