2012-08-27 116 views
3


我遇到以下代碼的問題。我希望驗證地址(城市,郵政編碼,州),並根據我們的數據庫中的內容進行檢查,該數據庫在CFC中被調用。 當我有Ajax的dataFilter設置,它進入錯誤並顯示「parseerror」,我看不到字符串JavaScript返回。 當我刪除dataFilter,在控制檯中,我看到JavaScript字符串返回,但它總是進入成功設置的「其他」。
任何人都知道發生了什麼事?我究竟做錯了什麼? CFC確實根據Fiddler正確返回(true/false)。Jquery Ajax調用CFC不工作

$.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> 

謝謝!

+1

您能與我們分享一個從cfc頁面返回的字符串的例子嗎?它實際上是json嗎? –

+0

謝謝,就是這樣。它在我們的系統中包含了一個需要查詢的腳本...當需要cfc時,我需要消除這個腳本。所以現在只包括JSON :) –

回答

2

而不是使用dataFilter只是設置{ dataType : "json" },你不需要使用dataFilter。另外如果你設置的響應頭爲Content-type: application/json,jquery會自動處理響應爲json。

此外,考慮取消異步,因爲你已經有了處理程序等待響應,這可能鎖定瀏覽器和移動你的錯誤,並完成處理程序使用jqXHR .done()和.fail()

+0

謝謝你,我想我現在明白了。 –

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

什麼它可以讓你做的是使用「這個」時它返回:

!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);