2012-06-27 155 views
2

我有一個表單,用戶輸入帳號,我需要檢查輸入的帳號是否是單擊保存按鈕時唯一的,但在表單提交前。這位於magento後端,並且ajax調用指向indexController中的函數acctnumAction()magento中的同步jquery ajax呼叫

賬號的數量是動態的,可以有5個,但只有1個,所以我需要對物品進行每個循環。我給帳號字段自己的類,並循環。

這就是我得到的。

function acctCheck(){ 
     jQ.each(jQ(".acctnum"), function(x, y){ 
      var acct = jQ(this).val(); 
      var field = this; 
      jQ.get("'.Mage::helper('core/url')->getHomeUrl().'dealerlocator/index/acctnum", {acctnum: acct}, function(data){ 
       var items = JSON.parse(data); 
       if(items != ""){ 
        $(field).addClass("validation-failed"); 
        return false; 
       } 
      }); 
     }); 
    } 
    function saveAndContinueEdit(){ 
     if(acctCheck() !== false){ editForm.submit(); } 
    } 

保存按鈕onclick命中saveAndContinueEdit()並運行功能來檢查帳戶號碼。

我知道這是行不通的,ajax會異步運行,並且在返回false之前不會返回任何內容,只要它不是false,它就會提交。但我已經試過包裝在$。當Ajax調用無濟於事,我裹在$。當如果saveAndContinueEdit(),像這樣

function saveAndContinueEdit(){ 
     jQ("#continueEdit").val("1"); 
     jQ.when(acctCheck()).done(function(valid){ 
      if(valid !== false){ 
       editForm.submit(); 
      } 
     }); 
    } 

但沒有做的伎倆要麼,而且可能連它應該如何工作,我只是想盡一切辦法。

讓它在每一箇中的這一點是,我可以設置一個變量爲false,如果一個帳號無效,但仍然通過其餘的迭代,以便該類仍然會被添加到字段,如果他們是無效的,所以用戶會知道,而不是修復一個,然後彈出一個無效,即使我的例子不是這樣編碼的。我知道get返回的數據是有效的,它不會同步運行。

任何人有任何想法?

+0

我沒有時間完全回答,但考慮使用像[Frame.js](https://github.com/bishopZ/Frame.js)這樣的流控制庫。它具有清理問題的能力;它有點像你想要什麼時候做的事情。呃,也許我們應該將Frame重命名爲$ .when。這是一個更好的名字。 – BishopZ

回答

0

我得到它使用延期工作。

function eachAcctChk(elem){ 
     return jQ.get("'.Mage::helper('core/url')->getHomeUrl().'dealerlocator/index/acctnum", {account: jQ(elem).val(), dealer: '.$data["id"].'}, function(data){ 
      if(data != "none"){ 
       jQ(elem).addClass("validation-failed"); 
       valid = false; 
      } 
     }); 
    } 
    function saveAndChk(){ 
     jQ("#continueEdit").val("0"); 
     AcctChk(); 
    } 
    function saveAndContinueChk(){ 
     jQ("#continueEdit").val("1"); 
     AcctChk(); 
    } 
    function AcctChk(){ 
     var deferreds = []; 
     jQ(".acctnum").each(function(){ 
      deferreds.push(eachAcctChk(this)); 
     }); 
     jQ.when.apply(null, deferreds).then(function(){ 
      if(valid){ 
       editForm.submit(); 
      } else { 
       valid = true; 
       alert("The highlighted dealer account numbers are already in use by another company. Unique account numbers are required."); 
      } 
     }); 
    } 

返回整個AJAX(GET)調用充當延期,我把他們都在一個數組,並傳遞到時()。所以當所有的ajax調用完成時,它會按()和瞧。