У меня есть вычисленное наблюдаемое, которое вызывает AJAX-вызовы на основе других данных (в вычисленном наблюдаемом). Полученные данные используются для заполнения части пользовательского интерфейса. Иногда эта часть пользовательского интерфейса скрыта, и я бы хотел избежать вызовов AJAX, когда он скрыт. Сейчас у меня есть следующие, но он обновляет каждый раз, когда isVisible
становится true
:Обновление только вычисленного наблюдаемого
this.loadData = ko.computed(function() {
if (this.isVisible()) {
this.isProcessing(true);
var self = this;
$.when.apply($, ko.utils.arrayMap(this.parent.data.filteredSelectedDatasetLinks(), function(datasetLink) {
return $.ajax({
url: datasetLink.getDownloadUrl('.json'),
success: function(data) {
//... do stuff with the data
}
});
}))
.done(function() {
self.isProcessing(false);
});
}
}, this);
Так, очевидно, мне нужно разделить это как-нибудь, но я не понял, как это сделать. Чтобы повторить, когда isVisible
является ложным, обновление не должно происходить. Когда значение isVisible
истинно, обновления происходят при изменении filteredSelectedDatasetLinks
. Когда isVisible
станет истинным, обновления произойдут, если filteredSelectedDatasetLinks
изменено, пока оно было ложным.
Может быть, грязный флаг на 'filterSelectedDatasetLinks', который вы проверяете, перед тем как сделать запрос AJAX и удалить после успешного запроса? –
Будет ли грязный флаг заметным? Как бы вы его установили - еще одна вычисленная наблюдаемая или ручная подписка? –
Если единственной зависимостью является 'filterSelectedDatasetLinks', то я предполагаю, что либо вычисленная, либо ручная подписка будет эквивалентной. Я бы сделал его наблюдаемым, но если вы уже получили доступ к 'filterSelectedDatasetLinks' в вычисленном вами списке, то он будет запускать независимо (не нужно, чтобы грязный флаг запускал что-либо, просто используйте, чтобы решить, нужно ли еще делать больше работы) –