ここで少し遅れます。RPの答えは、ノックアウトの宣言型の性質を壊すため、実際には満足していませんでした。具体的には、valueWithInitを使用してプロパティを定義する場合、それを以前のバインディングで使用することはできません。これが彼のjsfiddleのフォークです。
同じように使用しますが、それでも内部でドキュメント全体の宣言型です。
<input data-bind="valueWithInit: firstName" value="Joe" />
アイデアを拡張して、これを使用して初期化とバインディングを分離することもできます。
<input data-bind="initValue: lastName, value: lastName" value="Smith" />
これは少し冗長ですが、組み込みのバインディングの代わりにプラグインを使用している場合に役立ちます。
<input data-bind="initValue: lastName, myPlugin: lastName" value="Smith" />
もう少し拡張して、チェックボックスを初期化する方法も必要でした。
<input type="checkbox" data-bind="checkedWithInit: isEmployed" checked />
そして、ここにハンドラーがあります:
ko.bindingHandlers.initValue = {
init: function(element, valueAccessor) {
var value = valueAccessor();
if (!ko.isWriteableObservable(value)) {
throw new Error('Knockout "initValue" binding expects an observable.');
}
value(element.value);
}
};
ko.bindingHandlers.initChecked = {
init: function(element, valueAccessor) {
var value = valueAccessor();
if (!ko.isWriteableObservable(value)) {
throw new Error('Knockout "initChecked" binding expects an observable.');
}
value(element.checked);
}
};
ko.bindingHandlers.valueWithInit = {
init: function(element, valueAccessor, allBindings, data, context) {
ko.applyBindingsToNode(element, { initValue: valueAccessor() }, context);
ko.applyBindingsToNode(element, { value: valueAccessor() }, context);
}
};
ko.bindingHandlers.checkedWithInit = {
init: function(element, valueAccessor, allBindings, data, context) {
ko.applyBindingsToNode(element, { initChecked: valueAccessor() }, context);
ko.applyBindingsToNode(element, { checked: valueAccessor() }, context);
}
};
valueWithInit
単に内部で使用していることに注意initValue
してください。
jsfiddleで実際に動作することを確認してください。