2017-01-27 1 views
1

Я просто хочу знать, как использовать Нокаут-х onEnter с JQuery в $(document).on("keypress", "form"...

Потому что каждый раз, когда я нажимаю войти в form она представит формульной на сервер.

Использование event.preventDefault() предотвратит отправку формы, но также предотвращает нокаутов onEnter ...?!

$(document).on("keypress", "form", function (event) 
{ 
    if ($(event.target).closest("input[data-bind*='onEnter']")[0]) 
    { 
     event.preventDefault(); //preventing form to be submitted 
     return true;//but the function behind 'onEnter' will not be trigered 
    } 

    if (event.keyCode == 13)//Enter 
    { 
     event.preventDefault(); 
     return false; 
    } 
}); 

Как будет onEnter будет запущен после упомянутого выше кода?

Благодаря

+1

Почему вы используете JQuery для обработки нажатия клавиши вместо использования 'data-bind =" submit: doSomething "' на вашем '

'? (http://knockoutjs.com/documentation/submit-binding.html) И, нажав кнопку «отправить» в своей форме, кнопка ввода будет действовать так, как ожидалось. – Darren

+0

@Darren На самом деле у меня нет обработчика событий и нет кнопки, которая будет (это, кстати, стандартное поведение html для отправки формуляра при нажатии enter), не спрашивайте меня о причине использования контейнера 'form' без действия (кто-то сделал это решение, возможно, из-за bootstrap3. ..). Форма выглядит так: ' – user7425470

+0

Итак, у вас нет кнопки в вашей форме, но ожидаемое поведение - нажать enter ? Как пользователь узнает об этом?(просто любопытно) - и вы также, возможно, разумны, чтобы взглянуть на создание собственного обработчика привязки, вместо того чтобы пытаться смешивать jquery с нокаутом. Я добавлю ответ. – Darren

ответ

1

Во-первых, если вы собираетесь использовать JQuery вам нужно будет держать его в контексте Нокаут иначе вы будете иметь серьезные проблемы в креплениями и с вашего обновления вида, когда все меняется , Кроме того, вы в своем текущем коде вам придется называть ваш viewmodel.yourMethod - это не идеально.

Это, как говорится, стоило бы создать свой собственный bindingHandler, чтобы обработать это, а затем добавить обработчик в любой элемент, который вы используете.

Это не было протестировано, хотя и доставит вас рядом.

// the custom binding handler, its called executeOnEnter 
ko.bindingHandlers.executeOnEnter = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     var allBindings = allBindingsAccessor(); 
     // in this case, element is the html element you bound the handler - so perhaps your form tag 
     $(element).keypress(function (event) { 
      var keyCode = (event.which ? event.which : event.keyCode); 
      // the enter key 
      if (keyCode === 13) { 
       allBindings.executeOnEnter.call(viewModel); 
       event.preventDefault(); 
       return false; 
      } 
      return true; 
     }); 
    } 
}; 

Вы можете прикрепить это к вашей форме, что-то вроде:

<form data-bind="executeOnEnter:theFunctionInYourViewModelToCall" >

+0

это говорит мне, что 'call' undefined ..., но на самом деле это должно существовать ... – user7425470

+0

Как я уже сказал - его непроверено. Это на самом деле произошло из одной из окружений, которые мы построили так, что работает здесь. Я не могу прокомментировать, как вы построили свою модель просмотра. Дело в том, что это направление, в котором вы бы лучше поработали, так как вы можете использовать этот код (однажды исправленный для вас), чтобы работать над любой кнопкой ввода для любой модели просмотра, а не с помощью метода непосредственно в вашем режиме просмотра – Darren

+0

ok, спасибо (но мой viewmoddel не является неопределенным) – user7425470

0

Вы должны позволить Нокаут сделать все на высшем уровне обработки в вашем приложении событие.

Существует встроенный submit связывания, который захватывает submit события формы:

<form data-bind="submit: captureEnter"></textarea> 

Он работает так же, с помощью встроенного в event обязательным для всех видов других событий:

<textarea data-bind="event: {keypress: captureEnter}"></textarea> 

в методе captureEnter в вашем ViewModel вы можете посмотреть в код ключа и реагировать на клавишу ввода:

self.captureEnter = function (vm, event) { 
    var keyCode = event.keyCode || event.which; 

    if (keyCode === 13) { 
     // do something... 
    } else { 
     return true; // let the event do what it normally would do 
    } 
}); 

По умолчанию Knockout prevents the default action of an event. Используйте return true;, чтобы разрешить действие по умолчанию (т. Е. «Форма отправлена» или «символ появляется в текстовой области» и т. Д.).

Смежные вопросы