3


次のコードに問題があります。アドレス (市区町村、郵便番号、州) を検証し、CFC で呼び出されるデータベースの内容と照合することを検討しています。Ajax の dataFilter 設定があると、エラーになり、「parseerror」が表示され、文字列 javascript が返されません。dataFilter を削除すると、コンソールに javascript 文字列が返されますが、成功設定では常に「else」になります。
誰が何が起こっているのか知っていますか?私は何を間違っていますか?CFC は、Fiddler (true/false) に従って正しく返されます。

$.ajax({
    type: "get",
    url: "/component/validateLenderAddress.cfc",
    data: {
        method: "validateZipCityState",
        returnFormat: "json",
        zip:$('input[name*="zip"]').val(), 
        city:$('input[name*="city"]').val(), 
        state:$('input[name*="state"]').val()
    },
    async: false,
    cache: false,
    dataFilter: function(data) {
        return $.parseJSON(data);
    },
    success:function(data) {
        if (data) {
            alert('Address Validated');
            return true;
        }
        else {
            alert('Address could not be validated');
            return false;
        }
    },
    error: function(xhr, ajaxOptions, thrownError) {
        alert(ajaxOptions);
    }
});

私のCFCは

<cfcomponent output="false" extends="component.Database" hint="validates lender address lendermaint.inc">    
<cffunction name="validateZipCityState" output="false" returnType="struct" access="remote"> 
     <cfargument name="zip" type="string" required="true"> 
     <cfargument name="city" type="string" required="true"> 
     <cfargument name="state" type="string" required="true"> 

     <cfset var local = structNew()>

     <cfquery name="local.zipCodeList" datasource="#getDSN()#" username="#getUsername()#" password="#getPassword()#"> 
          SELECT TOP 1 1 
          FROM ZipCode 
          WHERE zipCode = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.zip)#"> 
               AND city = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.city)#"> 
               AND stateShort = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.state)#"> 
     </cfquery> 

     <cfreturn local.zipCodeList.recordCount EQ 1> 
</cffunction>

ありがとう!

4

2 に答える 2

2

設定したばかりの dataFilter を使用する代わりに、dataFilter{ dataType : "json" }を使用する必要はありません。また、jquery への応答にヘッダーを設定すると、Content-type: application/json自動的に応答が json として処理されます。

また、応答を待機するハンドラーが既にあるため、非同期を削除することを検討してください。これにより、ブラウザーがロックされ、エラーおよび完了ハンドラーが jqXHR .done() および .fail() を使用するように移動する可能性があります。

于 2012-08-27T17:57:27.080 に答える
2

私はすべてのリモートコンポーネントに以下を入れました:

<cfparam name="url.returnformat" default="json">
<cfparam name="url.queryformat" default="column">

ajax の実行を支援するために私が作成したプラグインを次に示します。

!function($, window, undefined) {
    $.ajaxSetup ({
         cache: false // http://stackoverflow.com/questions/168963/stop-jquery-load-response-from-being-cached
    });
    $('#msg').ajaxStart(function() {
      $(this).empty().removeClass('alert alert-info');
    });
    $.fn.myAjax = function(myURL, mySettings) {
        var local = {};
        local.settings = {
            type: 'post',
            dataType: 'json',
            context:this[0]
        };
        local.settings = $.extend({}, local.settings, mySettings);
        local.XHR = $.ajax(myURL,local.settings);
        local.XHR.done(function(result) {
            if (result.MSG) {
                $('#msg').html(result.MSG).addClass('alert alert-error');
            }
        });
        local.XHR.fail(function(A,B,C) {
            $('#msg').html(C).addClass('alert alert-error');
        });
        return local.XHR;
    };
}(jQuery, window);

できることは、返されるときに「this」を使用することです。

!function($, window, undefined) {
    var settings = {}
    settings.data = {};
    settings.data.method = 'Save';

    $('input:checkbox').on('change',function() {
        $(this).removeAttr('checked');
        settings.data.xxxID = $(this).val();
        var myPromise = $(this).myAjax('xxx.cfc',settings);
        myPromise.done(function(result) {
            if (!result.MSG) {
                $(this).prop('checked',true); // OK, it's been inserted.
                local.qryxxx = result.qry.DATA;
                local.qryxxx.RecordCount = result.QRY.ROWCOUNT;
                local.qryxxx.ColumnList = result.QRY.COLUMNS;
            }
        });
    });
}(jQuery, window);
于 2012-08-28T01:42:00.327 に答える