4

我正在尝试为游戏暗黑破坏神 3 制作一个小伤害计算器(我知道,我知道)。

基本上这个想法是它有一个“之前”和“之后”的值数组,代表你的角色的项目。“after”数组在更新时应该复制“before”数组。但是,对“after”数组的更改不应更新“before”数组。

然后每个数组都会显示一个 DPS(越多越好),它会向您显示两者之间的差异。这样做的目的是在使用游戏内拍卖行时轻松比较两个物品。

我已经设置了第一位 - “之前”数组工作得很好。但是,我不知道如何创建“后”数组,我想知道我是否已经使这个复杂程度不同。我应该使用两个视图模型,在 jQuery 中复制它,还是使用映射插件?我找不到任何正是我所追求的东西,尤其是 UI 要求似乎有点棘手

我在做什么:http: //jsfiddle.net/kimadactyl/GuMuY/8/

4

1 回答 1

2

这是一个可以帮助您入门的解决方案。我重构了你HeroItem的配置对象和一个可选的链接英雄。

我暂时假设数组是固定长度的。我通过after将 items 数组映射到一个 new 来创建数组HeroItem,使用 jquery extend 来进行深层复制。

当 alink被传入 HeroItem 时,它将订阅它的 observables 上的更改,并仅按照指定的方式进行单向更新。

function HeroItem(config, link) {
    var self = this, prop;
    self.item = config.item;
    self.int = ko.observable(config.int);
    self.ias = ko.observable(config.ias);
    self.critdmg = ko.observable(config.critdmg);
    self.critpc = ko.observable(config.critpc);
    self.min = ko.observable(config.min);
    self.max = ko.observable(config.max);

    if (link) {
        for (prop in link) {
            if (link.hasOwnProperty(prop) && ko.isObservable(link[prop])) {     
                console.log("subscribing " + prop);
                link[prop].subscribe((function(p) {
                    return function (newValue) {
                        console.log("updating " + p+ " to " + newValue);
                        self[p](newValue);
                    }
                })(prop));
            }
        }        
    }
}

self.after = ko.observableArray(ko.utils.arrayMap(self.items(), function(i) {
    return new HeroItem($.extend({}, ko.toJS(i)), i);
}));

http://jsfiddle.net/madcapnmckay/2MNFn/1/

不需要自定义绑定,它只使用所有 KO observables 拥有的订阅功能。如果您想扩展它以处理动态长度数组,只需订阅 items 数组并相应地清理 after 数组。

希望这可以帮助。

于 2012-06-22T17:42:44.343 回答