2012-06-10 19 views
4

我偶然發現knockoutjs和jquery mobile之間表面提交行爲的不兼容性。jQuery的移動和敲除窗體提交綁定

考慮下面的標記:

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

的目的是,防止淘汰賽後服務器/獲取,而是調用myKoSubmitAction。 jqm也將阻止標準提交行爲只爲jqm原因是表單提交被替換爲ajax請求。

所以雖然淘汰賽(大概)成功地阻止了標準的服務器請求,但卻無法阻止jqm發送ajax請求。

我在谷歌組中找到了這個問題的答案,並認爲它應該在SO上。見下面

回答

4

我已經能夠找到的最好的解決方案是以下自定義KO結合:

//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; 
    }); 
    } 
}; 

在標準的地方使用提交KO結合:

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

這是否適合iOS? – Daniel

+0

我沒有在iOS Safari中測試。我知道,jqm和/或knockout可能會在該瀏覽器中顯示出異常行爲。 – LOAS

5

你也可以將data-ajax="false"添加到<form>元素。

請參閱Submitting Forms

+0

那麼這是否不會以標準方式提交表單(使用頁面重新加載)呢? – Bartek

+3

否,因爲'data-bind =「submit:...」'覆蓋標準表單提交。 –

+0

@MikeWhite顯然不是,因爲這個建議對我有用,或者它可能需要按照包含庫的順序 – Pablo