Perché in questo esempio http://jsfiddle.net/JksKx/8/ div è perso il cursore quando scrivo il testo? Come risolvere un simile comportamento?Soppressione contenuto modificabile con binding personalizzato
6
A
risposta
15
L'evento keyup viene attivato e scritto sul viewmodel, che attiva la funzione di aggiornamento dell'associazione personalizzata. Questo sta riportando l'innerHTML all'elemento, il che sta causando la perdita di concentrazione.
Una soluzione semplice consiste nel controllare la funzione di aggiornamento se l'elemento.innerHTML è già uguale al valore su cui si desidera impostarlo.
http://jsfiddle.net/rniemeyer/JksKx/9/
ko.bindingHandlers.htmlValue = {
init: function(element, valueAccessor, allBindingsAccessor) {
ko.utils.registerEventHandler(element, "keydown", 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'].htmlValue) allBindings['_ko_property_writers'].htmlValue(elementValue);
}
}
)
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()) || "";
if (element.innerHTML !== value) {
element.innerHTML = value;
}
}
};
3
potrebbe desiderare di cambiare keydown a keyup, ma a parte questo funziona davvero bene =)
ko.utils.registerEventHandler(element, "keyup", function() {
Due cose che ho notato in questa contenteditable vincolante: 1. Assicurarsi che i dati -bind non è all'interno di un elemento con attributo contenteditable. L'elemento con contenteditable non attiva l'evento chiave. 2. Se l'utente fa clic destro su elemento e incolla il testo, questo non aggiornerà il valore. anche l'evento click dovrebbe essere assegnato. Inoltre, se si utilizzano pulsanti come "grassetto", l'evento click deve essere associato al corpo o qualcosa del genere. –
L'utilizzo della messa a fuoco sembra funzionare per eventi di clic "in grassetto" e altri simili. ko.utils.registerEventHandler (elemento, "focus", updateHandler); – Piercy