Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Knockout.js中复制一个数组_Javascript_Jquery_Knockout.js - Fatal编程技术网

Javascript 在Knockout.js中复制一个数组

Javascript 在Knockout.js中复制一个数组,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,我正在为暗黑破坏神3制作一个小的伤害计算器(我知道,我知道) 基本上,它有一个“before”和“after”值数组,表示角色的项。更新后,“after”数组应与“before”数组重复。但是,对“after”数组的更改不应更新“before”数组 然后,每个阵列显示一个DPS(越多越好)总数,并显示两者之间的差异。这样做的目的是,在使用游戏内拍卖行时,可以方便地比较两件物品 我已经设置了第一个位,“before”数组工作得很好。然而,我不知道如何创建“after”数组,我想知道我是否已经将它的

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

基本上,它有一个“before”和“after”值数组,表示角色的项。更新后,“after”数组应与“before”数组重复。但是,对“after”数组的更改不应更新“before”数组

然后,每个阵列显示一个DPS(越多越好)总数,并显示两者之间的差异。这样做的目的是,在使用游戏内拍卖行时,可以方便地比较两件物品

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


我的目标是什么:

这里有一个解决方案,可以让您开始。我重构了您的
英雄项目
,以获取一个配置对象和一个可选的链接英雄

我现在假设数组的长度是固定的。我从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”列。有什么想法吗?别担心,我想得太多了。即使我不完全理解你对这个对象的扩展,你也完全理解了。谢谢