Я написал специальный обработчик привязки, который переключает, является ли элемент contentEditable. Я также хочу, чтобы любые привязки html обновлялись при редактировании содержимого элемента, поэтому он прослушивает входные события и обновляет привязки html, если они доступны.knockout contentEditable binding
ko.bindingHandlers.contentEditable = {
update: function (element, valueAccessor, allBindingsAccessor) {
var value = ko.unwrap(valueAccessor());
element.contentEditable = value;
var $element = $(element);
if (value) {
var allBindings = allBindingsAccessor();
var htmlBinding = allBindings.html;
if (ko.isWriteableObservable(htmlBinding)) {
$element.on("input", function (event) {
htmlBinding(element.innerHTML);
});
}
} else {
$element.off("input");
}
}
};
Однако здесь проблема:
- пользователь вводит что-то в элемент
- входного срабатывает событие
- HTML, связывание обновляется
- innerHTML элемента обновляется
- Позиция курсора в элементе возвращается к началу
jsfiddle говорит тысячу слов ... http://jsfiddle.net/93eEr/1/
Я немного озадачен, как именно, чтобы справиться с этим.
Вам нужно обернуть значение html в вычисленное значение, которое только обновляет привязку html, если вы не редактируете. Также он должен уведомлять о мутации, когда вы прекращаете редактирование – Anders
Быстрая и грязная информация должна обновляться только при размывании http://jsfiddle.net/93eEr/2/ – Anders
Более приятной версией было бы написать новый обработчик привязки из-за отсутствия лучшего name, назовем его 'htmlLazy', который обновляет элементы DOM, к которым он привязан, только когда они не являются в настоящее время' contentEditable'. – Tomalak