オブザーバブルの作成をカスタムバインディング内にカプセル化しようとしています。これは、knockoutjs-validationのisValidによく似ていますが、このプロパティは将来、複雑な一連のイベントを記録する別のバインディングの結果になるため、バインディングを拡張しません。入力すると、これにカスタムバインディングを使用する以上のことをすべきではないように感じます。
次のコードは、オブザーバブルの作成を担当するカスタムバインディングを示しています。
ko.bindingHandlers.myBinding = {
init: function (
element, valueAccessor, allBindingsAccessor,
viewModel, bindingContext) {
console.log("init myBinding");
var observable = valueAccessor();
observable.IsRed = ko.observable(true);
console.log("isred created");
ko.applyBindingsToNode(element, {
value: observable,
mySubBinding: observable.IsRed
}, viewModel);
console.log("finish myBinding");
},
update: function (
element, valueAccessor, allBindingsAccessor,
viewModel, bindingContext) {
console.log("update myBinding");
}
};
私が抱えている問題は、applyBindingsコマンドの一部が実行された後にオブザーバブルが作成されたように見え、ビューの後方バインディングのみがオブザーバブルの正しい値を確認できることです。
動作を示すためにjsfiddleを作成しました。その中で、IsRed
問題のオブザーバブルです。
http://jsfiddle.net/ricardomp/c2HnJ/15/
期待される結果は、同じ値の前後の赤い背景とスパンタグの入力になります。
その結果を達成するために私は何ができますか?結果のバインディングは、外部のオブザーバブルやプロパティに依存するべきではありませんよね?別の実装を提案しますか?
前もって感謝します。
アップデート:
myBindingは、複数のバインディングをカプセル化するバインディングであることに言及する価値があると思います。したがって、IsRedのように、同様のオブザーバブルに3つまたは4つのバインディングが割り当てられます。
最終更新:
RPの回答の後、オブザーバブルの初期化を実行するために次のコードを記述しました。
ko.observable.fn.colorStatus = function () {
this.isRed = ko.observable();
this.isGreen = ko.observable();
this.isBlue = ko.observable();
this.ResetStatus = (function () {
this.isRed (undefined);
this.isGreen (undefined);
this.isBlue (undefined);
}).bind(this);
return this;
};
その後、初期化中にobservableでcolorStatusを呼び出すだけで済みました。
self.value = ko.observable().colorStatus();
そしてそれがすべてです。