2012-06-27 108 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调用完成时,它会按()和瞧。