2

ユーザーがアカウント番号を入力するフォームがあり、保存ボタンがクリックされたときに、フォームを送信する前に、入力されたアカウント番号が一意であることを確認する必要があります。これはmagentoバックエンドにあり、ajax呼び出しはacctnumAction()indexControllerの関数を指しています。

アカウント番号の数は動的であり、最大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呼び出しを$ .whenでラップしようとしましたが、役に立たなかった場合は、ifをsaveAndContinueEdit()$.whenでラップしました。

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

しかし、それでもうまくいきませんでした。おそらく、それがどのように機能するかさえ分からないでしょう。私は思いついたものを何でも試していました。

それぞれにそれを含めることのポイントは、アカウント番号が有効でない場合に変数をfalseに設定できるようにすることですが、それでも残りを繰り返して、フィールドが無効な場合でもクラスがフィールドに追加されるようにするため、ユーザーは私の例がそのようにコーディングされていなくても、修正する代わりに、別のものが無効としてポップアップすることを知っています。getによって返されるデータが有効であることはわかっていますが、同期して実行されません。

誰かアイデアはありますか?

4

1 に答える 1

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)呼び出し全体を返すことは遅延として機能します。私はそれらをすべて配列にスローし、それをwhen()に渡します。したがって、すべてのajax呼び出しが完了すると、then()にヒットし、出来上がりです。

于 2012-07-12T16:23:28.813 に答える