これがあなたが始めるべき解決策です。HeroItem
構成オブジェクトとオプションのリンクされたヒーローを取得するようにリファクタリングしました。
今のところ、配列は固定長であると想定しています。ディープコピーを実行するためにjqueryextendを使用after
して、新しい配列にマッピングすることにより、items配列から配列を作成します。HeroItem
alink
が渡されると、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/
カスタムバインディングは必要ありません。すべてのKOオブザーバブルが持つサブスクリプション機能を使用するだけです。これを拡張して動的長配列に対応する場合は、items配列にサブスクライブし、それに応じてafter配列をクリーンアップします。
お役に立てれば。