我刚刚开始使用json和Id喜欢以某种方式重用从jquery post请求中返回为json的数据。
例如,我有一个方法返回所有客户的json数组以及所有相关字段。如何将其存储为可以在我的javascript类上主动提供的其他方法上重用的对象,而无需再为另一个json对象发出请求。
以下是我的javascript类示例。
/* Sales Orders Class */
function SalesOrders() //construct function
{
this.siteURL = "http://example.com/";
this.controllerURL = "http://example.com/salesOrders/";
this.salesOrderID = $('input[name="salesOrderId"]').val();
}
salesOrder = new SalesOrders; //invoke the class constructor
/* Data Objects */
SalesOrders.prototype.loadCustomers = function()
{
//get jsonData object
$.post(this.controllerURL + "load_customers",
function(data)
{
//pass jsonObject to writeCustomerOption method
salesOrder.writeCustomerOption(data);
}
);
}
SalesOrders.prototype.loadCustomer = function(data)
{
//set salesOrder customer
salesOrder.updateSalesOrderCustomer(data);
//alert(data)
//get jsonData object
$.post(this.controllerURL + "load_customer", { customer_id: data },
function(data)
{
//pass data to writeCustomerAddress
salesOrder.writeCustomerAddress(data);
}
);
}
/* UI Manipulation */
SalesOrders.prototype.writeCustomerOption = function(data) //create customer dropdown from json on loadCustomers
{
var customers = eval(data);
for(var counter = 0; counter < customers.length; counter++)
{
//alert(customers[counter].name);
var optn = document.createElement("OPTION");
optn.text = customers[counter].name;
optn.value = customers[counter].cid;
document.getElementById("customerSelect").options.add(optn);
}
}
SalesOrders.prototype.writeCustomerAddress = function(data)
{
//parse json array into objects
var customerInfo = jQuery.parseJSON(data);
//create formated address objects
var billTo = customerInfo.name + "\n" + customerInfo.billing_street + "\n" + customerInfo.billing_city + " " + customerInfo.billing_state + ", " + customerInfo.billing_zip + "\n" + customerInfo.phone;
var shipTo = customerInfo.name + "\n" + customerInfo.shipping_street + "\n" + customerInfo.shipping_city + " " + customerInfo.shipping_state + ", " + customerInfo.shipping_zip + "\n" + customerInfo.phone;
//write billTo & shipTo
$("#billToTextAreaTarget").html(billTo);
$("#shipToTextAreaTarget").html(shipTo);
}
/*
UI Interaction
*/
SalesOrders.prototype.selectCustomer = function()
{
this.customerID = $("#customerSelect option:selected").val();
//load and write customer info
salesOrder.loadCustomer(this.customerID);
//load and write customer items
salesOrder.loadCustomerItems(this.customerID);
//replace add item button
salesOrder.replaceAddItem();
}
答案 0 :(得分:1)
将变量放在更全局的范围内(可能是在定义salesOrder的同一级别),具有以下效果:
var lastJSONReponse = null;
然后,在响应回调中,只需将数据分配给该变量:
function(data){
lastJSONResponse = data;
salesOrder.writeCustomerOption(data);
}
现在,只要变量在您需要的范围内,该变量将在您需要的整个持续时间内持续。在ajax调用之外访问它之前一定要检查它:
if (data != null){
// proceed
}
答案 1 :(得分:1)
我有类似的问题。
我已经使用dom对象来存储json对象和JSON.stringify以及JSON.parse来操纵数据。这样。
$.post(url,
{ params },
function(data) {
$("#json_data_store").val(JSON.stringify(data));
},
"json");
并将json对象存储在隐藏的输入对象中。
<input type="hidden" id="json_data_store" value="" />
然后当我们需要操作数据时,我们使用JSON.parse:
var data = JSON.parse($("#json_data_store").val());
这就是我解决这个问题的方法。 我希望你也能解决它。
答案 2 :(得分:0)
向SalesOrder类添加一个属性,以存储从GetCustomers返回的客户(或者将其设置为“私有”,并使用您根据需要延迟加载列表的访问器方法。
将其视为一种典型的OO语言中的对象(C#,无论如何),只是用于定义属性/属性和方法的不同语法。