2012-07-24 14 views
11

Potrzebujesz pomocy przy knockoutjs i wiążąc wydarzenie keypress. Próbuję podłączyć nokaut tak, że podniosę klawisz Enter z pola tekstowego. Mogę wykonać tę samą akcję, co kliknięcie przycisku. To trochę trudne do wyjaśnienia, ale mam nadzieję, że JsFiddle zademonstruje to, co próbuję osiągnąć.Wiążące zdarzenie keypress na knockoutjs, obserwowalne nie jest wypełnione

http://jsfiddle.net/nbnML/8/

Problem mam to, że wartość obserwowalne nie jest uzyskiwanie aktualizowane i myślę, że to ma coś wspólnego z zauważalny nie jest aktualizowany aż ostrość przesuwa się z dala od pola tekstowego?

Wszelkie rozwiązania tego problemu.

Dzięki!

Odpowiedz

38

Jedną opcją jest użycie dodatkowego powiązania valueUpdate, aby wymusić aktualizację każdego naciśnięcia klawisza. Na przykład, chcesz zrobić:

<input type="text" data-bind="value: InputValue, valueUpdate: 'afterkeydown', event: { keypress: RunSomethingKey }" /> 

Jeśli to nie jest to, czego po, to naprawdę byłoby chcesz odpalić Event elementu zmienić w swoim obsługi. Na przykład z jQuery, zrobiłbyś coś takiego: $(event.target).change();.

Byłoby jednak lepiej przenieść to do niestandardowego powiązania. Może coś (prawdopodobnie należy sprawdzić, czy wynik valueAccessor() jest funkcją):

ko.bindingHandlers.enterKey = { 
    init: function(element, valueAccessor, allBindings, vm) { 
     ko.utils.registerEventHandler(element, "keyup", function(event) { 
      if (event.keyCode === 13) { 
       ko.utils.triggerEvent(element, "change"); 
       valueAccessor().call(vm, vm); //set "this" to the data and also pass it as first arg, in case function has "this" bound 
      } 

      return true; 
     }); 
    }   
}; 

Oto próbka aktualizacja: http://jsfiddle.net/rniemeyer/nbnML/9/

+0

masz do tego tuż przede mną http://jsfiddle.net/nbnML/10/ – Arbiter

+1

Darned pomocne, dzięki. –

+0

Niesamowita odpowiedź. Jednak na firefox naciśnięcie klawisza Enter na polu tekstowym powoduje dwukrotne uruchomienie zdarzenia. Czy są jakieś pomocne myśli? – Nikhil

1

nie zniżki submit Wiązania: http://knockoutjs.com/documentation/submit-binding.html

To zajmuje się niektórymi wersjami IE 9/10, takimi jak klucz powrotu, który nie aktualizuje obserwowalnego. Przy tym pod opieką nie trzeba przechwycić kod dostępu przy 13

html:

<form data-bind="submit:RunSomething"> 
<input type="text" data-bind="value: InputValue" /> 
<input type="submit" value="test" /> 
<div data-bind="text: InputValue" /> 
</form> 

Kod:

var ViewModel = function() { 
    var self = this; 
    self.InputValue = ko.observable(''); 

    self.RunSomething = function (ev) { 
     window.alert(self.InputValue()); 
    } 
} 
ko.applyBindings(new ViewModel()); 

Zobacz to tutaj:

http://jsfiddle.net/jnewcomb/uw2WX/

+1

Z wyjątkiem przypadków, gdy nie ma: https://github.com/SteveSanderson/knockout/issues/760 – Szabi

Powiązane problemy