2013-04-20 57 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

而在原来的问题回答评论我意识到,以帮助防止一些多余的电话,我可以添加一个检查,看看是否该位的值已经等于价值,如果这样什么都不做,所以如果以编程方式尝试打开一个已经打开的位,那么它不会触发计算,因为没有实际改变。