存储从jquery post返回的json数据

时间:2011-02-01 22:42:58

标签: javascript jquery json

我刚刚开始使用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();
}

3 个答案:

答案 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#,无论如何),只是用于定义属性/属性和方法的不同语法。