2013-02-14 2 views
0

У меня есть вычисленное наблюдаемое, которое вызывает 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 изменено, пока оно было ложным.

+0

Может быть, грязный флаг на 'filterSelectedDatasetLinks', который вы проверяете, перед тем как сделать запрос AJAX и удалить после успешного запроса? –

+0

Будет ли грязный флаг заметным? Как бы вы его установили - еще одна вычисленная наблюдаемая или ручная подписка? –

+0

Если единственной зависимостью является 'filterSelectedDatasetLinks', то я предполагаю, что либо вычисленная, либо ручная подписка будет эквивалентной. Я бы сделал его наблюдаемым, но если вы уже получили доступ к 'filterSelectedDatasetLinks' в вычисленном вами списке, то он будет запускать независимо (не нужно, чтобы грязный флаг запускал что-либо, просто используйте, чтобы решить, нужно ли еще делать больше работы) –

ответ

0

Вот что я в конечном итоге использовал на основе комментариев RP Niemeyer.

this.trackData = ko.computed(function() { 
    this.parent.data.filteredSelectedDatasetLinks(); // for notification 
    this.isDataDirty(true); 
}, this); 

this.loadData = ko.computed(function() { 
    if (this.isVisible() && this.isDataDirty()) { 
     this.isDataDirty(false); 
     this.isProcessing(true); 
     var self = this; 
     $.when.apply($, ko.utils.arrayMap(this.parent.data.filteredSelectedDatasetLinks.peek(), function(datasetLink) { 
      return $.ajax({ 
       url: datasetLink.getDownloadUrl('.json'), 
       success: function(data) { 
        //... do stuff with the data 
       } 
      }); 
     })) 
     .done(function() { 
      self.isProcessing(false); 
     }); 
    } 
}, this); 
0

Предположительно, вы хотите назвать ваш ajax, когда filteredSelectedDatasetLinks изменен (и только если он виден?). Я думаю, что лучший способ сделать это, чтобы сделать эту зависимость явно с помощью функции subscribe ... (я немного упрощен и исправлена ​​ошибка с вашим окончательным «это»)

this.filteredSelectedDatasetLinks.subscribe(function() { 
    if (this.isVisible()) { 
     this.isProcessing(true); 
     var self = this; 
     $.when.apply($, ko.utils.arrayMap(this.filteredSelectedDatasetLinks(), function(datasetLink) { 
      return $.ajax({ 
       url: datasetLink.getDownloadUrl('.json'), 
       success: function(data) { 
        //... do stuff with the data 
       } 
      }); 
     })) 
     .done(function() { 
      self.isProcessing(false); 
     }); 
    } 
}, this); 

Проблема с оригинальной попыткой, что ko.computed запускает функцию один раз и автоматически работает над тем, какие наблюдаемые им нужно подписать. В вашем случае это включало наблюдаемый isVisible (что не то, что вы хотели). Но, делая это прямо с подпиской на звонок, вам больше не нужно беспокоиться о том, что isVisible уволил обратный вызов.

+0

Спасибо за ответ. Но это не удовлетворяет этому требованию: «Когда isVisible становится истинным, обновления происходят, если filterSelectedDatasetLinks изменен, когда он был ложным». –

+0

Yup, имеет смысл. Ваш ответ, безусловно, путь. – Felix

Смежные вопросы