Cómo llamar a una función utilizando knockout.js al entrar se pulsa la tecla.. aquí está mi código de abajo.
ko.bindingHandlers.enterkey = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var inputSelector = 'input,textarea,select';
$(document).on('keypress', inputSelector, function (e) {
var allBindings = allBindingsAccessor();
$(element).on('keypress', 'input, textarea, select', function (e) {
var keyCode = e.which || e.keyCode;
if (keyCode !== 13) {
alert('a');
return true;
}
var target = e.target;
target.blur();
allBindings.enterkey.call(viewModel, viewModel, target, element);
alert('b');
return false;
});
});
}
};
ko.applyBindings(viewModel);
HTML
<input type="text" data-bind="value:sendMessageText, enterkey: sendMessage" />
ViewModel
function contactsModel(){
var self = this;
self.jid=ko.observable();
self.userName=ko.observable();
self.sendMsgText=ko.observable();
self.sendMessage = function(){
if(self.sendMessageText() == '' )
alert("Enter something in input field");
else{
var message = {
to : self.userName(),
message : self.sendMsgText()
}
self.sentMessages.push(message);
sendMessage(message);
}
}
}
Cualquier idea acerca de lo que está mal aquí o sugerencias para un mejor enfoque.
- Puedes publicar el código para su viewModel? Mirando a los octavos de final de unión, se está a la espera de encontrar un método llamado sendMessage en perspective. Tu código jQuery para enlazar con el evento keypress puede estar en conflicto con esto.
- Esta pregunta puede ofrecer una solución a su problema: stackoverflow.com/questions/4386311/…
- he añadido viewmodel en cuestión ahora… pls comprobar.. gracias
- sí me refería al enlace u siempre y similares enlaces relacionados también.. era de ninguna ayuda en mi caso becoz parece que hay algo que me estoy perdiendo aquí.. así que decidido a publicar una nueva pregunta.
Cuando usted crea su propio knockout bindingHandler, se utiliza de la misma manera como los otros bindingHanlders por ejemplo:
data-bind="text: myvalue"
por lo que el código HTML se tendrá que buscar algo como esto
<input type="text" data-bind="value:sendMessageText, valueUpdate: 'afterkeydown', enterkey: sendMessage" />
Un importante enlace para agregar es el
valueUpdate: 'afterkeydown'
de unión. Sin esta unión cuando un usuario escribe texto en la entrada y golpea a entrar en el evento onblur no se levanta antes deenterkey
de unión. Esto se traduce en la observables de devolver un valor inesperado y no el texto actual si el valor de entrada se accede en una acción invocada porenterKey
.Otro Aspecto a medida Enlaces para KnockoutJS
EDITAR
Esto es lo que he utilizado anteriormente en otros proyectos.
JsFiddle Demo
valueUpdate: 'afterkeydown'
para garantizar el comportamiento esperadoenterkey
, pero dentro de las init que se buscaexecuteOnEnter
. línea 7 se debeallBindings.enterkey.call()
en lugar deallBindings.executeOnEnter.call()
valueUpdate
controlador dedata-bind="value: organisationName, valueUpdate: 'input', executeOnEnter:initialize"
element.blur();
justo antes deallBindings.enterkey.call(viewModel);
de llamada y de esa manera tu no arrinconada en la esquina de tener que especificar unvalueUpdate
. La adición devalueUpdate
hace un montón de aplicaciones demasiado hablador si su hablar con el back-end a través de ajax.Sin necesidad de un enlace personalizado, sólo tiene que utilizar knockout del evento keypress(Knockout docs):
Y su función:
JSFiddle ejemplo
De EDICIÓN: Nuevo enlace de octavos de final(3.2.0) : textInput – evita la necesidad de tener un valueUpdate de unión.
Esto funcionó para mí, gracias a @DaafVader para la mayoría de los de ella.
a la vista
en viewmodel
Y esto funcionó para mí, gracias a @DaafVader.
a la vista:
en javascript:
A poner el evento keyup en sus eventos de jquery en lugar de knockout evento reducción de la complejidad de los octavos de final viewmodel.
Utilizar el envío de unión (http://knockoutjs.com/documentation/submit-binding.html) en el formulario alrededor de su entrada, que es de lo que se hizo para.
Ejemplo de los octavos de final docs:
También se encarga automáticamente de su botón, si es que hay uno.