多くの編集可能な領域を含む文字列があります。この文字列を検討してください
var str = "Regular ... are patterns used to match character .... in strings. In ..., regular expressions are also objects."
編集可能な領域には ('...') が含まれています。その場所を編集可能にしたいと考えています。その文字列内に編集可能なコンテンツを挿入したいということです。この目的のためにノックアウトを使用したいと思います。ノックアウトを使用して編集可能なコンテンツについてニーマイヤーを参照しました。誰かがこれを達成するためのより良い方法を提案できますか? これは私のコードです
ko.bindingHandlers.editableContent = {
init: function(element, valueAccessor, allBindingsAccessor) {
$(element).css({ "background-color": "#ff77ee", "margin-left": "-2px", "letter-spacing": "0.05"});
ko.utils.registerEventHandler(element, "keyup", function() {
var modelValue = valueAccessor();
var elementValue = element.innerHTML;
if (ko.isWriteableObservable(modelValue)) {
modelValue(elementValue);
}
else { //handle non-observable one-way binding
var allBindings = allBindingsAccessor();
if (allBindings['_ko_property_writers'] && allBindings['_ko_property_writers'].editableContent) allBindings['_ko_property_writers'].editableContent(elementValue);
}
})
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()) || "";
element.innerHTML = value;
}
};
ko.bindingHandlers.myBinding = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var div = document.createElement("div");
var fulltext = valueAccessor();
element.appendChild(div);
div.innerHTML = fulltext().replace(/\.\.\./g, "<span data-bind = 'editableContent : editedText' contenteditable='true'></span>");
ko.applyBindings(viewModel,div);
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
}
};
$(document).ready(function () {
var viewModel = function () {
var self = this;
self.fullText = ko.observable('Regular ... are patterns used to match character .... in strings. In ..., regular expressions are also objects.');
self.editedText = ko.observable('...');
}
ko.applyBindings(new viewModel());
});