Есть к примеру 5 select'ов, списки атрибутов для продуктов, у продуктов некоторые аттрибуты могут пересекаться, некоторые нет.
При выборе значения любого из них, идет обращение к backend, который фильтрует возможные значения всех select'ов (текущего select'а тоже), то есть приводит в согласованное состояние все списки, после этого нужно выбрать сами значения select'ов на первые из списков, если они не были выбраны до этого.
Проблема возникает из-за рекурсивности, то есть обращение к backend идет по событию смены значения select'a (.subscribe), но после того как значения получены, нужно сменить значения других select'ов и получается нужно делать опять запросы.
Может быть knockout для этого не предназначен? Буду благодарен за любые подсказки.
можно завернуть observable'ы от все селектов в один computed observable с rateLimit: 0 и подписываться на изменения этого одного computed observable'а.
var filterOne = ko.observable();
var filterTwo = ko.observable();
var aggregatedFilter = ko.pureComputed(function () {
return { filterOne: filterOne(), filterTwo: filterTwo() };
}).extend({ rateLimit: 0 /* уведомляем только один раз при нескольких подряд идущих мутациях */ });
aggregatedFilter.subscribe(function (aggregatedFilterValue) {
// используем aggregatedFilterValue в запросе
});
Спасибо попробую, отпишусь, сейчас сделал через knockout.reactor, он выдает все изменения в указанной части модели.
Но это не совсем красиво получилось, анализ того что именно изменилось не очень удобный.