对于viewmodel中的一堆对象,我有以下结构
我有一个基础数组,里面填充了包含ko.observable项目的对象。
Ex:selections = [{Legs:{'0':ko.observable(12)}},{Legs:{'0':ko.observable(0)}}]
我想要实现的是当用户点击一个复选框时,应该切换该Runner的Selected值。现在,当发生这种情况时,我还想更新Cache值以反映Runners selected状态
缓存用作二进制存储12 == 1100 ==复选框3和4已选中
现在所有这些我都可以开始工作没有问题,我显然甚至不需要使Cache可观察。
但是,我还需要以编程方式更改Cache值,我希望这些复选框能够自动反映这些更改。
以下sorta的作用是什么,但创建了一个循环,敲除优雅处理,但其结果不可靠,这会减慢速度。
如何创建此绑定设置?
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 :(得分: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个跑步者都使用相同的缓存,那么当用户选择其中一个时,所有20个将重新检查自己......
对于我的特定情况,未来的更改可能是删除Peek on Enabled,并执行检查,如果!Enabled然后默认关闭该位,而不是允许Disabled Checked复选框。
修改强>
更改'read'函数以使用unwrapObservable(),以防通过在其他地方删除/删除observable的方式清除Cache。
修改2
在回答原始问题中的评论时,我意识到为了帮助防止一些冗余调用,我可以添加一个检查以查看该位的值是否已经等于值,如果是,则不执行任何操作,所以如果以编程方式我尝试打开如果没有实际发生任何变化,那么它已经打开了,它就不会触发计算机。