Skip to main content
 首页 » 编程设计

javascript之在 Knockout.js 中复制数组

2026年07月24日14over140

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

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

每个阵列都会显示 DPS 总计(越多越好),并显示两者之间的差异。这个想法是这样在使用游戏内拍卖行时可以轻松比较两个元素。

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

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

请您参考如下方法:

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

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

当在 HeroItem 中传递链接时,它将订阅其可观察值的更改,并仅按照指定的方式进行单向更新。

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/

不需要自定义绑定(bind),它只使用所有 KO 可观察对象都具有的订阅功能。如果您想扩展它以应对动态长度数组,只需订阅 items 数组并相应地清理 after 数组即可。

希望这有帮助。