Javascript 击倒我能绕过这个循环吗?
对于viewmodel中的一组对象,我有以下结构 我有一个底层数组,里面填充的对象中有ko.observable项 Ex:selections=[{Legs:{'0':ko.observable(12)},{Legs:{'0':ko.observable(0)}] 我试图实现的是,当用户单击复选框时,该复选框应切换该跑步者的选定值。现在,当这种情况发生时,我还想更新缓存值以反映选定状态 缓存用作二进制存储器12==1100==选中复选框3和4 现在我可以开始工作了,没问题,我显然不需要让缓存可见 但是,我还需要通过编程更改缓存值,我希望复选框能够自动反映这些更改 下面的sorta可以工作,但会创建一个循环,knockout可以优雅地处理,但其结果不可靠,这会减慢速度 如何创建此绑定设置?Javascript 击倒我能绕过这个循环吗?,javascript,knockout.js,knockout-2.0,Javascript,Knockout.js,Knockout 2.0,对于viewmodel中的一组对象,我有以下结构 我有一个底层数组,里面填充的对象中有ko.observable项 Ex:selections=[{Legs:{'0':ko.observable(12)},{Legs:{'0':ko.observable(0)}] 我试图实现的是,当用户单击复选框时,该复选框应切换该跑步者的选定值。现在,当这种情况发生时,我还想更新缓存值以反映选定状态 缓存用作二进制存储器12==1100==选中复选框3和4 现在我可以开始工作了,没问题,我显然不需要让缓存可见
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;
}
function Runner(姓名、赔率、比赛、赛程、赛后){
var runner={
姓名:姓名,,
赔率:赔率,
岗位:岗位,,
种族:种族,
腿:腿,
缓存:选择[race]。腿[leg],
选择:可观察到的高(假),
已启用:可观察到(真),
有效:正确
};
runner.Check=ko.computed(函数(){
如果(!this.Enabled.peek()| |!this.Valid)返回;
var checked=this.Selected();
var cache=this.cache();
如果(选中){
这个.Cache(Cache | 1我在写完我的问题后有了一个清晰的瞬间。但我认为这是一个不错的问题,尽管如此,与其改变或删除我的问题,不如发布我的最新解决方案,希望得到一些评论
所以最后我完全放弃了选择的值
注意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);
runner.Check=ko.computed({
读:函数(){
var cache=ko.utils.unwrapObservable(this.cache);//编辑1
return cache&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);