Pull to refresh

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

Понадобилось мне в 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. С другой стороны это избавляет вас от написания сложного кода, учитывающего все фильтры, примененные к этому набору данных

Напоследок полезная статья, которая помогла найти такое решение.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings