2014-01-27 24 views
0

我想弄清楚如何做這樣的事情,如自動處理服務器上的一些viewmodels observable數組,並讓它逐一更新jquery ui progressbar,我想出了以下代碼:)處理可視化的視圖模型與進度條和淘汰賽

<div data-bind="progressBar: { value: progressValue, max: ViewModels().length }" style="width: 100%"> 
</div> 

ko.bindingHandlers.progressBar = { 
     init: function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
      var value = valueAccessor(); 
      $(element).progressbar({ 
        value: false, 
        max: ko.unwrap(value.max) 
       }); 
     }, 
     update: function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
      var value = valueAccessor(); 
      $(element).progressbar("option", "value", ko.unwrap(value.value)); 
     } 
    } 

function ViewModel(model) { 
     var self = this; 
     ko.mapping.fromJS(JSON.parse(model), {}, self); 

     self.progressValue = ko.observable(0); 
     ko.computed(function() { 
      if (self.ViewModels().length > 0) { 
       var first = self.ViewModels()[0]; 
       $.ajax({ 
        //send first viewmodel on server and do something with it 
        success: function (result) { 
         self.ViewModels.remove(first); 
         self.progressValue(self.progressValue() + 1); 
        } 
       }); 
      } 
     }) 
    } 

當您計算的遞歸調用時,您如何看待這種方法?也許你沒有看到任何真正的用法,但是如果,你會如何做到這一點?

回答

1

文檔說:

淘汰賽,而它已經評估

(read more here)

因此,如果它真的遞歸你有一個問題不會重新啓動計算機的評價用你的方法。

但您的情況並非真正遞歸,因爲success回調將在服務器在單獨的執行堆棧中響應(它是異步)後纔會調用。

所以我認爲你的方法很好,假設它給你你正在尋找的功能。

更簡單的方法來做到這一點沒有計算的僅僅是把它放在函數裏面並調用函數從成功回調:

 self.progressValue = ko.observable(0); 

     sendRemaining(); 

     function sendRemaining() {  
      if (self.ViewModels().length > 0) { 
       var first = self.ViewModels()[0]; 
       $.ajax({ 
        //send first viewmodel on server and do something with it 
        success: function (result) { 
         self.ViewModels.remove(first); 
         self.progressValue(self.progressValue() + 1); 
         sendRemaining(); 
        } 
       }); 
      } 
     }  
+0

謝謝您的回答,並注意有關遞歸中計算的觀測,還另這樣做可以做到的方式是訂閱數組,但正如你所說的使用函數更簡單 – sanjuro