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