хранение данных json, возвращенных из поста jquery - PullRequest
0 голосов
/ 02 февраля 2011

Я только начинаю понимать, как использовать json, и я хотел бы каким-то образом повторно использовать данные, возвращаемые как json из запроса jquery post.

Например, у меня есть один метод, который возвращает массив 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 ]

1 голос
/ 20 апреля 2011

У меня похожая проблема с этим.

Я использовал объект 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());

Вот как я это решаю.Я надеюсь, что вы тоже можете решить эту проблему.

1 голос
/ 02 февраля 2011

Поместите переменную в более глобальную область (вероятно, на том же уровне, что определен salesOrder), что-то вроде:

var lastJSONReponse = null;

Затем, в ответном обратном вызове, просто назначьте данные этомупеременная:

function(data){
  lastJSONResponse = data;
  salesOrder.writeCustomerOption(data);
}

Теперь, пока переменная находится в необходимой области, эта переменная будет действовать в течение всего времени, в котором она вам нужна.Просто убедитесь, что проверили это перед доступом к нему вне вызова ajax:

if (data != null){
  // proceed
}
0 голосов
/ 02 февраля 2011

Добавьте атрибут в класс SalesOrder для хранения клиентов, возвращаемых из GetCustomers (или сделайте его «закрытым» с методом доступа, который используется для отложенной загрузки списка по мере необходимости.

Думайте об этом в терминах, как если бы это был объект на типично ОО-языке (C #, что угодно), просто другой синтаксис для определения свойств / атрибутов и методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...