カスタム バインディングで、データをモデルに書き戻すことができません。問題は、「書き込み可能な」プロパティに書き込む方法がないことです。
ノックアウト 2 では使用する可能性がありましたがallBindingsAccessor()._ko_property_writers
、バージョン 3 ではそのようなことはありません。
ko.bindingHandlers.htmlValue = {
init: function(element, valueAccessor, allBindingsAccessor, context) {
var handler;
handler = function() {
var value, writable;
writable = valueAccessor();
console.log(allBindingsAccessor());
value = element.innerHTML;
// NOTE In previous versions this could be used:
//writable(value);
//writable = value <-- this also does not update model, as writable is simple string
// Or this:
//allBindingsAccessor()._ko_property_writers
return allBindingsAccessor().htmlValue = value;
};
ko.utils.registerEventHandler(element, "keyup", handler);
ko.utils.registerEventHandler(document, "click", handler);
},
update: function(element, valueAccessor) {
var value;
value = valueAccessor();
if (element.innerHTML !== value) {
element.innerHTML = value;
}
}
};
var data = {
name: 'blah'
};
ko.track(data);
ko.applyBindings({data: data});
私のHTML:
<div contenteditable="true" data-bind="htmlValue: data.name"></div>
<input data-bind="value: data.name, valueUpdate: 'afterkeydown'"></input>
<input data-bind="value: data.name, valueUpdate: 'afterkeydown'"></input>
Js はこの例をいじります: http://jsfiddle.net/t5rWd/2/
予想される動作: div コンテンツを変更した後に入力を更新する必要があります (コンテンツ編集可能です) 。
現在の動作:一方向バインディングのように機能し、div は更新されますが、入力は更新できません。