2010-10-22 28 views
10

Tôi có một chức năng CFC ColdFusion như thế này:Làm thế nào tôi có thể gửi một biến mảng đến một phương thức từ xa Coldfusion CFC thông qua ajax bằng cách sử dụng jQuery?

<cffunction access="remote" name="getResults" 
    returntype="struct" 
    returnformat="JSON" 
    output="no"> 

    <cfargument name="q" required="true" type="array" /> 

... 
</cffunction> 

Làm thế nào để gọi chức năng này từ jQuery? Cả hình thức mã hóa mảng của jQuery đều không nhận được Coldfusion để xem giá trị như mảng.

Nếu bạn vượt qua "q = a & q = b" (giống như jQuery.ajaxSettings.traditional = true), hàm sẽ nhận được chuỗi "a, b" chứ không phải mảng. Trong khi tách trên dấu phẩy có vẻ giống như một khả năng, nó sẽ không hoạt động nếu một trong các giá trị "q" chứa dấu phẩy. Ngoài ra, lý tưởng, chức năng ở phía máy chủ không cần phải nhận thức được các vấn đề về cách tuần tự hóa dữ liệu qua dây và phải tiếp tục tham gia vào một mảng.

Nếu bạn vượt qua "q [] = a & q [] = b" (mặc định jQuery), nó sẽ không ánh xạ tới tham số "q". Nếu bạn cố gắng thay đổi tên của tham số "q" thành "q []", CFC sẽ bị lỗi do tên tham số không hợp lệ.

Trả lời

8

Điều đầu tiên phải biết là jQuery Ajax requests do not encode arrays so have you to use something else to encode the data (đây là nơi jquery.JSON.js xuất phát từ tham chiếu phía dưới). Vì vậy, với một JSON mã hóa tìm thấy ở đó, tôi sau đó tìm ra các cú pháp chính xác bằng cách làm việc với cfajaxproxy và nghiên cứu các URL nó tạo ra trong Firebug:

http://localhost/remote.cfc?method=getResults&argumentCollection=%7B%22q%22%3A%5B1%2C2%5D%7D

Có những "argumentcollection" cách tiếp cận là đúng, và biến "q" với tham chiếu đến một mảng nằm trong đó.

tôi đã sử dụng đoạn mã sau như một chiếc giường kiểm tra:

remote.cfc

<cfcomponent output="false"> 
    <cffunction access="remote" name="getResults" 
     returntype="struct" 
     returnformat="JSON" 
     output="no"> 

     <cfargument name="q" required="true" type="array" /> 

     <cfreturn {a=1,b=2}> 
    </cffunction> 
</cfcomponent> 

remote.cfm để xem cách cfajaxproxy tạo url của nó

<cfajaxproxy cfc="Remote" jsclassname="Remote"> 
<cfoutput> 
<script language="javascript" type="text/javascript"> 
var oRemote = new Remote(); 
alert(oRemote.getResults([1,2])); 
</script> 
</cfoutput> 

xa.html làm điều đó với jQuery

<script language="javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script> 
<script language="javascript" src="jquery.JSON.js"></script> 
<script language="javascript" type="text/javascript"> 
var argumentCollection = { q: [1,2] }; 
$.ajax({ 
    url:  'remote.cfc', 
    data:  { 
     method: 'getResults', 
     argumentCollection: $.JSON.encode(argumentCollection) 
    }, 
    success: function(response) { 
     alert(response); 
    }, 
    dataType: 'json' 
}); 

</script> 
+0

Vâng, tôi muốn nói rằng jQuery không mã hóa mảng, chỉ không theo cách mà ColdFusion có thể chấp nhận. Theo mặc định trong jQuery 1.4.3, các mảng được mã hóa theo kiểu tương thích với PHP và Ruby on Rails, bằng cách cung cấp nhiều tham số, với tên tham số thêm "[]" vào tên biến. Sử dụng cài đặt "truyền thống", nó mã hóa chúng giống như một biểu mẫu HTML cho nhiều hộp kiểm, chỉ cần gửi nhiều tham số. Cách tiếp cận của bạn để tìm ra điều này phù hợp với tôi. Cảm ơn bạn đã gửi mã mẫu chi tiết! – jrduncans

+0

Tôi đang gặp vấn đề tương tự với bài đăng hôm nay từ Angular 4 đến CF10. công việc 'argumentCollection' vẫn hoạt động. Gửi một mảng JSON như một đối số biểu mẫu thì không. Cần lưu ý rằng việc thay đổi kiểu đối số CFC từ 'mảng' thành' bất kỳ' sẽ cho phép mã CFC xử lý đối số dưới dạng một mảng với công việc đối sốCollection xung quanh. – JeffryHouser

-1

Làm cách nào để kiểm tra giá trị của bạn bằng dấu phẩy và thoát chúng trước khi chuyển đến Coldfusion, sau đó sử dụng ListToArray để chuyển đổi và (nếu cần) mã hóa lại dấu phẩy?

+0

Lý tưởng nhất là chức năng CFC không cần phải thay đổi, để nó có thể được gọi ở phía máy chủ theo cách thông thường. Tôi đã cập nhật câu hỏi để làm rõ điều đó. – jrduncans

+0

Đã hiểu, có vẻ như bạn đã tìm thấy một giải pháp tốt. –

6

Điều tra vấn đề này, tôi tìm thấy bài đăng blog sau: http://www.coldfusionjedi.com/index.cfm/2010/3/23/Using-jQuery-to-post-an-array-to-a-ColdFusion-Component - Đề xuất này mã hóa mảng dưới dạng chuỗi JSON và sau đó deserializing mảng bên trong phương pháp CFC, với tác động không may của yêu cầu hàm CFC phải thay đổi để đối phó với JSON.

Vì vậy, tôi đã điều tra thêm và đây là giải pháp tốt nhất mà tôi đã tìm thấy từ trước tới nay.

Bằng cách xem các cuộc gọi HTTP được thực hiện khi sử dụng cfajaxproxy, tôi phát hiện ra rằng bạn có thể gửi một tham số đối sốCollection duy nhất dưới dạng chuỗi JSON để gọi phương thức CFC từ xa.

Vì vậy, các cuộc gọi phía khách hàng trông giống như thế này (sử dụng plugin jquery-json để làm serialization):

var params = {q: ['a', '1,2,3']}; 

$.getJSON('My.cfc?method=getResults', {argumentCollection: $.toJSON(params)}, function(data) { 
// handle data 
}); 
+0

psst ... Tôi nghĩ bạn đã bỏ một ']' ở đâu đó. –

Các vấn đề liên quan