Ứng dụng: Chức năng JavaScript lắng nghe các thay đổi trên phần tử biểu mẫu (nhập & chọn) và đăng dữ liệu lên phương pháp CFC gán chúng cho cấu trúc Phiên. Cấu trúc được trả về, làm cho dữ liệu biểu mẫu có thể sử dụng được trong suốt thời gian của phiên. Ứng dụng được điều chỉnh từ mã số tại Raymond Camden's Using a server, or session storage, to persist form values.Phiên dịch từ CFScript sang cú pháp thẻ ColdFusion
Vấn đề: Mã CFC gốc được viết bằng CFScript. Bởi vì chúng tôi đang ở trên ColdFusion 8, tôi gặp lỗi khi phương thức được gọi. Vì vậy, tôi dịch các phương pháp thành cú pháp thẻ Coldfusion và ngừng nhận được lỗi đó. Trong Công cụ tìm kiếm của Chrome, tôi có thể xem dữ liệu chuyển đến CFC qua đối tượng JSON mỗi khi tôi nhập nội dung nào đó vào phần tử biểu mẫu. Vì vậy, tôi biết chức năng JavaScript đang hoạt động. Và mặc dù tôi không nhận được bất kỳ lỗi trả lại nào, nhưng có một số hành vi khiến tôi tin rằng bản dịch của tôi không chính xác. Ví dụ: kết xuất của cấu trúc phiên chỉ hiển thị phần tử đầu vào cuối cùng được nhập, thay vì tất cả chúng (như trường hợp trong bản trình diễn của Ray).
Đây là phiên bản CFScript gốc và sau đó là bản dịch thẻ của tôi. Ngoài bất kỳ nhận xét nào về bản dịch của tôi là sai, tôi muốn có một giải thích về dòng này, <cfset s.name = [s[name]] />
, đặc biệt là cấu trúc [s[name]]
vì tôi không thể nói rõ những gì đang xảy ra ở đó. Cảm ơn.
kịch bản cú pháp:
component {
remote void function preserveSession(string awardData) {
if(!isJSON(arguments.awardData)) return;
arguments.awardData = deserializeJSON(arguments.awardData);
//convert the array into a name based struct
var s = {};
for(var i=1; i<=arrayLen(arguments.awardData); i++) {
var name = arguments.awardData[i].name;
if(!structKeyExists(s, name)) {
s[name] = arguments.awardData[i].value;
} else {
//convert into an array
if(!isArray(s[name])) {
s[name] = [s[name]];
}
arrayAppend(s[name], arguments.awardData[i].value);
}
}
session.awardFormData = s;
}
}
tag cú pháp:
<cfcomponent>
<cffunction name="preserveSession" access="remote" returntype="void" output="no">
<cfargument name="awardData" type="string" />
<cfset var s = {} />
<cfif NOT isJSON(arguments.awardData)>
<cfreturn />
</cfif>
<cfset arguments.awardData = #deserializeJSON(arguments.awardData)# />
<cfloop index="i" from="1" to="#arrayLen(arguments.awardData)#">
<cfset name = #arguments.awardData[i].name# />
<cfif NOT structKeyExists(s, name)>
<cfset s.name = #arguments.awardData[i].value# />
<cfelse>
<cfif NOT isArray(s.name) >
<cfset s.name = [s[name]] />
</cfif>
<cfset arrayAppend(s.name, arguments.awardData[i].value) />
</cfif>
</cfloop>
<cfset session.awardFormData = s />
<cfreturn />
</cffunction>
</cfcomponent>
+1 để đề cập đến gói như trái ngược với viết lại – Leigh
Một điều bạn cần làm trong CF8 nếu tôi nhớ lại là di chuyển var của bạn lên đầu khối tập lệnh. Nhưng nếu không thì cfscript sẽ hỗ trợ tất cả các ký hiệu đối tượng hiện đại như vậy. CF9 cho phép bạn var bất cứ nơi nào như cẩu hiện rõ ràng bây giờ xảy ra trong CF9 +. Tôi sẽ chỉnh sửa điều đó để phản ánh điều này. – williambq
@ williambq - Có thể tốt hơn để thêm phần cuối cùng đó dưới dạng [sửa] (http://stackoverflow.com/posts/16948078/edit), vì vậy nó hiển thị rõ hơn. Sau đó xóa nhận xét. – Leigh