2013-01-15 30 views
0

是否將markAllCompleted實現爲一個計算目的?看起來複選框檢查綁定應該是一個函數,並且addItem中的用法應該是一個常規可觀察的。爲什麼markAllCompleted是Breeze TODO樣本中的「計算」?

真的好奇。對於Breeze和Knockout,我仍然相當不討厭......事實上,也許這是一個比微風問題更多的淘汰問題...

(僅供參考,我已在下面列出相關代碼)

當我覺得答案應該是顯而易見的時候,我討厭提問,但事實並非如此。我無法抗拒。

謝謝!

function addItem() { 
     var item = dataservice.createTodo(); 

     item.IsDone(vm.markAllCompleted()); 
     item.Description(vm.newTodo()); 
     item.CreatedAt(new Date()); 

     if (item.entityAspect.validateEntity()) { 
      extendItem(item); 
      vm.items.push(item); 
      dataservice.saveChanges(); 
      vm.newTodo(""); 
     } else { 
      handleItemErrors(item); 
     } 
    } 


     vm.markAllCompleted = ko.computed({ 
      read: function() { 
       var state = getStateOfItems(); 
       return state.itemsLeftCount === 0 && vm.items().length > 0; 
      }, 
      write: function (value) { 
       suspendItemSave = true; 
       vm.items().forEach(function (item) { 
        item.IsDone(value); 
       }); 
       suspendItemSave = false; 
       dataservice.saveChanges(); 
      } 

<input id="markAll" type="checkbox" data-bind="checked: markAllCompleted"> 

回答

3

我認爲這裏的混亂主要是由不正確的命名爲計算值markAllCompleted引起的。你描述的另一種方式(點擊綁定到一個函數)與按鈕(無狀態)相關,而不是複選框(它具有自己的狀態,true或false)。

這個計算的(可以說是)更合適的名字就像allItemsDone。一個簡單的實現不會讓你寫入這個值(即它是一個簡單的只讀計算,並且在視圖中它將是一個只讀複選框或等價物)。但是由於演示實現確實有具有此功能(爲了讓用戶選中/取消選中主複選框),那麼計算所需的函數也需要具有寫入功能,但它可以保留一個計算的,而不是簡單的只讀文件。

+0

很好的解釋...和反饋。可以爭取整個名稱:) – Ward

+0

我也發現這些信息是有用的,當試圖瞭解這個問題的答案:http://knockoutjs.com/documentation/computedObservables.html#writeable_computed_observables –