0

我的视图模型中的一堆对象具有以下结构

我有一个基础数组,其中填充了包含 ko.observable 项目的对象。

例如:选择 = [{Legs:{'0':ko.observable(12)}}, {Legs:{'0':ko.observable(0)}}]

我想要实现的是,当用户单击复选框时,应该切换该 Runner 的 Selected 值。现在,当这种情况发生时,我还想更新 Cache 值以反映 Runners 选择的状态

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

现在所有这些我都可以开始工作了,显然我什至不需要让 Cache 可观察。

但是,我还需要以编程方式更改缓存值,并且我希望复选框自动反映这些更改。

下面的内容可以正常工作,但会创建一个循环,可以优雅地处理淘汰赛,但其结果不可靠,这会减慢速度。

如何创建此绑定设置?

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"/>
4

1 回答 1

0

写完我的问题后,我有片刻的清醒。但我认为这是一个很好的问题,而不是改变或删除我的问题,我只是发布我最新的解决方案并希望得到一些批评。

所以最后我完全放弃了 Selected 值

注意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 on Enabled,并执行一个检查,如果 !Enabled 然后默认关闭该位,而不是可能允许禁用选中复选框。

编辑

将“读取”函数更改为使用 unwrapObservable(),以防缓存通过可观察对象在其他地方被删除/移除而被清除。

编辑 2

在回答原始问题中的评论时,我意识到为了帮助防止一些冗余调用,我可以添加一个检查以查看该位的值是否已经等于 value,如果是,则什么也不做,所以如果以编程方式我尝试打开一点已经打开然后它不会触发计算,因为实际上没有任何改变。

于 2013-04-20T05:46:50.633 回答