Knockout我可以绕过这个计算循环吗?

时间:2013-04-20 05:28:25

标签: javascript knockout.js knockout-2.0

对于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"/>

1 个答案:

答案 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

在回答原始问题中的评论时,我意识到为了帮助防止一些冗余调用,我可以添加一个检查以查看该位的值是否已经等于值,如果是,则不执行任何操作,所以如果以编程方式我尝试打开如果没有实际发生任何变化,那么它已经打开了,它就不会触发计算机。