Javascript 在Knockout.js中复制一个数组
我正在为暗黑破坏神3制作一个小的伤害计算器(我知道,我知道) 基本上,它有一个“before”和“after”值数组,表示角色的项。更新后,“after”数组应与“before”数组重复。但是,对“after”数组的更改不应更新“before”数组 然后,每个阵列显示一个DPS(越多越好)总数,并显示两者之间的差异。这样做的目的是,在使用游戏内拍卖行时,可以方便地比较两件物品 我已经设置了第一个位,“before”数组工作得很好。然而,我不知道如何创建“after”数组,我想知道我是否已经将它的复杂性提高到了不同的程度。我应该使用两个视图模型,在jQuery中复制它,还是使用映射插件?我找不到任何我想要的东西,尤其是UI需求似乎有点棘手Javascript 在Knockout.js中复制一个数组,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,我正在为暗黑破坏神3制作一个小的伤害计算器(我知道,我知道) 基本上,它有一个“before”和“after”值数组,表示角色的项。更新后,“after”数组应与“before”数组重复。但是,对“after”数组的更改不应更新“before”数组 然后,每个阵列显示一个DPS(越多越好)总数,并显示两者之间的差异。这样做的目的是,在使用游戏内拍卖行时,可以方便地比较两件物品 我已经设置了第一个位,“before”数组工作得很好。然而,我不知道如何创建“after”数组,我想知道我是否已经将它的
我的目标是什么:这里有一个解决方案,可以让您开始。我重构了您的
英雄项目
,以获取一个配置对象和一个可选的链接英雄
我现在假设数组的长度是固定的。我从items数组创建after
数组,方法是将它映射到一个新的项目
,使用jquery extend进行深度复制
当一个链接
传入时,项目将订阅对其可观察对象的更改,并仅按指定单向更新
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);
}));
不需要自定义绑定,它只使用所有KO观察对象都具有的订阅功能。如果您想扩展它来处理动态长度数组,只需订阅items数组并相应地清理after数组
希望这有帮助。显然,您需要两个不同的阵列。之后的
数组是
之前的的副本(即深度副本)。然后,您需要为之前的数组定义自定义敲除绑定,该绑定在更新时也将更新之后的数组。你完了!顺便说一句,杰巴比,绝对不是我-我不在乎暗黑破坏神3.:)谢谢-不过,在这里进行深度复制的正确方法是什么?我尝试过的那些要么同步更新,要么根本无法正常工作。当你说自定义绑定时,你的意思是写一个类函数吗?我对术语不太在行!编辑:我找到了文档页面,谢谢,这正是我要找的!当我说“定制绑定”时,我的意思是:对于深度复制。。。在您的例子中,每个英雄项(…)
初始化新的英雄项(…)
两次就足够了,并且在列表之前的中添加一个,在列表之后的中添加第二个。我认为问题的一部分是目前每个类方法都是与self.items数组相关的。所以,即使我复制了那个数组,我仍然需要抽象我的函数——或者我是不是想得太多了?另外,使用jQuery DOM选择器来运行$。中的每个语句似乎都会使它崩溃,就好像当前我创建了两个表,它将两列中的所有内容相加一样。我想得太多了吗?谢谢你。重构是绝对必要的。然而,我仍然在为如何获得新的列总数而挣扎。因为它们只是参考资料,我找不到一种方法来让Knockout在不破坏订阅的情况下添加“after”列。有什么想法吗?别担心,我想得太多了。即使我不完全理解你对这个对象的扩展,你也完全理解了。谢谢