2013-04-20 58 views
0

我有一束物體在我的視圖模型以下結構Knockout我可以繞過這個計算循環嗎?

我有一個底層數組填充有具有在ko.observable項對象

例:選擇= [{腿:{'0 ':ko.observable(12)}},{腿:{'0':ko.observable(0)}}]

我想實現的是,當用戶點擊複選框時,應該切換該Runner的選定值。發生這種情況現在,當我也想更新緩存值,以反映選擇狀態的運動員

緩存用作二進制存儲12 == 1100 ==複選框3和4被檢查

現在,所有的我可以開始工作沒有問題,我顯然甚至不需要使Cache可觀察。

但是,我也需要以編程方式更改緩存值,我希望複選框自動反映這些更改。

下面是sorta的一些作品,但創建了一個Loop,它可以很好地處理,但其結果不可靠,這會降低速度。

如何創建此綁定設置?

function Runner(name, odds, race, leg, post) { 
    var runner = { 
     Name: name, 
     Odds: odds, 
     Post: post, 
     Race: race, 
     Leg: leg, 
     Cache: selections[race].Legs[leg], 
     Selected: ko.observable(false), 
     Enabled: ko.observable(true), 
     Valid: true 
    }; 

    runner.Check = ko.computed(function() { 
     if (!this.Enabled.peek() || !this.Valid) return; 
     var checked = this.Selected(); 
     var cache = this.Cache(); 

     if (checked) { 
      this.Cache(cache | 1 << this.Post); 
     } else { 
      this.Cache(cache & ~(1 << this.Post)); 
     } 

    }, runner); 

    return runner; 
} 

編輯

<input type="checkbox" data-bind="checked: Selected, enable: Enabled"/> 
+0

我無法弄清楚Check計算是如何與跑步者相關的。你能告訴我們你的標記或創建一個小提琴演示嗎? – CodeThug 2013-04-20 18:06:34

+0

用戶點擊複選框 - >選定的更改匹配 - >檢查啓動,因爲選擇改變 - >在緩存設置適當的位標誌 - >(從這裏循環開始)調用檢查,因爲緩存改變等等......哦,我想我可以添加一行說:檢查比特值,如果它與Selected已經相同,那麼什麼也不做,這將退出循環是嗎? – Zholen 2013-04-20 18:50:05

回答

0

我寫我的問題後,有一個清晰的瞬間。但我認爲這是一個很好的問題,而不是改變或刪除我的問題,只是發佈我的最新解決方案,希望得到一些批評。

所以最終我放棄了選擇的價值完全

注意的this.Post + 1是具體到我的需求,其不需要通常情況下,我只想離開的第一位未使用的爲將來使用。

runner.Check = ko.computed({ 
     read: function() { 
      var cache = ko.utils.unwrapObservable(this.Cache); //Edit 1 
      return cache & 1 << (this.Post + 1); 
     }, 
     write:function(value) { 
      var cache = this.Cache(); 
      if (!this.Enabled.peek() || !this.Valid || this.Post === -1) return; 
      var mask = 1 << (this.Post+1); 
      if(value === !(cache & mask)){ //Edit 2 
       this.Cache(value ? cache | mask : cache & ~mask); 
      } 
     } 
    }, runner); 

約做事這樣一個糟糕的事情是,如果我有20名選手誰所有使用相同的緩存,那麼當用戶選擇其中1所有20將重新檢查自己...

對於我的具體情況,未來的變化可能是刪除已啓用的Peek,並執行檢查,如果已啓用,則默認關閉該位,而不是可能允許「禁用已選中」複選框。

編輯

更改「讀」功能的情況下,使用unwrapObservable()中的高速緩存由別處除去觀察到的方式被刪除/清除。

編輯2

而在原來的問題回答評論我意識到,以幫助防止一些多餘的電話,我可以添加一個檢查,看看是否該位的值已經等於價值,如果這樣什麼都不做,所以如果以編程方式嘗試打開一個已經打開的位,那麼它不會觸發計算,因爲沒有實際改變。