2016-05-03 2 views
-3

У меня очень запутанное поведение в javascript. Тело запроса HTTP: undefined=&undefined=.Результат Array.map не указан в запросе Ajax

var data = [1, 2].map(function(item) { 
    return { 
     Id: item, 
     Quantity: 1 
    } 
}); 

$.ajax({ 
    url: "someUrl", 
    type: "POST", 
    dataType: "json", 
    data: data 
}); 

Как я могу предотвратить потерю данных? Пожалуйста, порекомендуйте.

+1

даже не могу понять, что вы пытаетесь сделать , –

+0

Вы положили 'console.log' сразу после вашей карты, чтобы подтвердить, что это проблема? Если да, можете ли вы опубликовать, что делает ваша карта? Как и псевдо-карта, не должно возникать проблемы. – ste2425

+0

@PLAudet, я пытаюсь передать эти данные на сервер. Я ожидаю увидеть '[{Id: 1, Quantity: 1}, {Id: 2, Quantity: 1}]' в теле запроса POST. Но данные не определены. – Neshta

ответ

3

Проблема заключается в том, что вы публикуете data с Content-Type:application/x-www-form-urlencoded заголовком. Проверьте документацию для $.ajax. В этом случае данные, передаваемые сериализуются с $.param методом, который, если вы проверить документацию выполняет следующие действия:

Создать упорядоченное представление массива, простой объект, или объект JQuery, пригодный для использования в запросе URL string или Ajax. Если объект jQuery передан, он должен содержать элементы ввода с свойствами name/value.

И теперь вы знаете, почему данные размещены в

неопределенных = неопределенных & неопределенными = не определено

Наконец, если вы хотите разместить полезную нагрузку JSON можно stringify данных самостоятельно и добавить application/json content-type:

$.ajax({ 
    url: "someUrl", 
    type: "POST", 
    dataType: "json", 
    data: JSON.stringify(data), 
    contentType: "application/json; charset=utf-8" 
}); 
+0

Благодарим вас за решение актуальной проблемы – mhodges

+0

Извините, я не заметил, что вы были первыми с правильным ответом. Благодарим вас за помощь. – Neshta

1

Атрибут data в функции ajax - это не данные, возвращаемые из выполнения ajax. Это данные, отправленные ему.

Используйте функцию обратного вызова success для обработки данных возвращается

$.ajax({ 
    url: "someUrl", 
    type: "POST", 
    dataType: "json", 
    data: data, 
    success: function(dataReturned) { 
     // Do something with dataReturned 
    } 
}); 

Посмотрите на documentation

+0

Если вы внимательно прочитаете мой вопрос, вы обнаружите, что я говорю о ajax ** request ** (а не ** respose **). – Neshta

+0

Затем отредактируйте свое сообщение, чтобы объяснить, что вы пытаетесь сделать. –

1

Y ou необходимо, чтобы stringify ваш data объект, чтобы его можно было восстановить с помощью $_POST в пункте назначения.

var data = [1, 2].map(function(item) { 
    return { 
     Id: item, 
     Quantity: 1 
    } 
}); 
$.ajax({ 
    async: false, 
    url: 'someUrl', 
    method: 'post', 
    dataType: 'json', 
    data: 'data=' + JSON.stringify(data) /** <---- here; add a to retrieve on other end; in this case 'data=' */ 
}); 

Затем к нему доступ в ваш someUrl вы можете расшифровывает его с помощьюjson_decode():

$json = json_decode($_POST['data']); 

становится:

$json = Array 
(
    [0] => stdClass Object 
     (
      [Id] => 1 
      [Quantity] => 1 
     ) 

    [1] => stdClass Object 
     (
      [Id] => 2 
      [Quantity] => 1 
     ) 

) 

echo $json[0]->Id; // 1 
+0

Спасибо за помощь! Это очень глупая ошибка. – Neshta

+0

Пока вы учитесь на своих ошибках, они никогда не «глупые». Если вы * повторите * свои ошибки ... ну, это еще одна история;) – Marcus

Смежные вопросы