2012-06-10 3 views
4

Я наткнулся на кажущуюся несовместимость между knockoutjs и jquery mobile, когда дело доходит до формы представления поведения.jquery mobile and notockout form submit binding

Рассмотрим следующую разметку:

<form data-bind="submit: myKoSubmitAction"> 
    <!-- form fields here --> 
</form> 

Намерение состоит в том, что нокаута предотвращает серверную запись/получить, а вместо этого вызывает myKoSubmitAction. jqm также предотвратит стандартное представление поведения только для jqm, причина в том, что представление формы заменяется на запрос ajax.

Таким образом, в то время как нокаут (предположительно) преуспевает в предотвращении стандартного запроса сервера, он не может помешать jqm отправлять запрос ajax.

Я нашел ответ на эту проблему в группе google и подумал, что она также должна быть на SO. Ниже

ответ

4

Лучшее решение я смог найти в следующих пользовательских ко связывания:

//This binding fixes apparent incompatibility between knockout and jqm 
ko.bindingHandlers.jqmsubmit = { 
    init: function (el, accessor, allbindings, vm) { 
    ko.bindingHandlers.submit.init(el, accessor, allbindings, vm); 
    $(el).submit(function (e) { 
     // prevent the submit behavior 
     e.preventDefault(); 
     e.stopPropagation(); 
     return false; 
    }); 
    } 
}; 

Чтобы использовать вместо стандартного представить ко связывании:

<form data-bind="jqmsubmit: myKoSubmitAction"> 
    <!-- form fields here --> 
</form> 
+0

Это работает для вас в iOS ?? – Daniel

+0

Я не тестировал сафари на iOS. jqm и/или нокаут могут проявлять отклоняющееся поведение в этом браузере, насколько я знаю. – LOAS

5

Вы также можно добавить data-ajax="false" в элемент <form>.

См. Submitting Forms.

+0

Не будет ли это отправить форму стандартным способом (с перезагрузкой страницы)? – Bartek

+3

Нет, потому что 'data-bind =" submit: ... "' переопределяет стандартную форму submit. –

+0

@MikeWhite, по-видимому, нет, потому что это предложение сработало для меня, или, может быть, оно должно быть выполнено в том порядке, в котором вы включаете библиотеки – Pablo