这是一个可以帮助您入门的解决方案。我重构了你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 数组。
希望这可以帮助。