Javascript 击倒我能绕过这个循环吗?

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 现在我可以开始工作了,没问题,我显然不需要让缓存可见

对于viewmodel中的一组对象,我有以下结构

我有一个底层数组,里面填充的对象中有ko.observable项

Ex:selections=[{Legs:{'0':ko.observable(12)},{Legs:{'0':ko.observable(0)}]

我试图实现的是,当用户单击复选框时,该复选框应切换该跑步者的选定值。现在,当这种情况发生时,我还想更新缓存值以反映选定状态

缓存用作二进制存储器12==1100==选中复选框3和4

现在我可以开始工作了,没问题,我显然不需要让缓存可见

但是,我还需要通过编程更改缓存值,我希望复选框能够自动反映这些更改

下面的sorta可以工作,但会创建一个循环,knockout可以优雅地处理,但其结果不可靠,这会减慢速度

如何创建此绑定设置?

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);