Подтвердить что ты не робот

JQuery удаляет пустые массивы при отправке

У меня есть следующий код:

$.post('block_ajax.php'
    ,   {   'action': 'set_layout'
        ,   'listid': 123
        ,   'layout': []
        }
    ,   function(data) {
            // ...
        }
);

Получение script (block_ajax.php) только получает параметры "действие" и "listid". Когда я проверяю, что отправлено с помощью Chrome, я вижу, что параметр "layout" даже не отправляется на бэкэнд script.

Поскольку существует разница между пустым массивом и отсутствием массива, я хотел бы, чтобы JQuery отправил пустой массив. Я могу найти некоторые признаки того, что JQuery (1.6.1), кажется, делает это, но не как остановить это от этого. Формат JSON позволяет пустым массивам и пустым объектам, поэтому я думаю, что это должно быть возможно.

Кто-нибудь знает, что изменить, поэтому JQuery может отправлять пустые массивы?

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: См. ответ люка для лучшего решения: fooobar.com/questions/225382/...

Я оставил свой предыдущий ответ конкретно о том, как Rails обрабатывает [""] ниже, как объясняет ссылка выше.


Примечание: специфичный для Rails

Я не уверен, почему вам нужно отправить пустой параметр. Достаточно просто проверить наличие параметра в PHP-скрипте. Однако, если вы действительно хотите это сделать, используйте 'layout': [""] вместо 'layout': []. Параметр должен быть отправлен.

(Кроме того, вы можете переименовать layout в layout[], чтобы указать, что это массив, но в этом нет необходимости.)

Ответ 2

Наша организация имеет два подхода к проблеме:

  • Отправка данных как JSON в отличие от POST-данных является хорошим универсальным подходом, хотя иногда это немного сложно интегрировать с такими фреймворками, как Rails, потому что вам, возможно, придется добавлять явные внутренние вызовы для декодирования Данные JSON.
  • [""], как отметил vinod, будет хорошо работать, так как многие фреймворки (например, Rails) часто будут рассматривать это как пустой массив. (по этой причине см. этот ответ).
    • Примечание. Это работает при попытке интеграции с некоторыми аспектами Rails, особенно при отправке списка идентификаторов объектов, связанных отношением has_many. Например. если у вас есть таблица foos и таблица bars, а foos has_many :bars through :foo_bars, способ удалить все ассоциации в объекте foo - передать foo: { bar_ids: [""] }.

Оба подхода являются более хакерскими, чем хотелось бы, и я был бы рад найти более чистый подход.

Ответ 3

2018, извините, что отвечаю на старый вопрос, но здесь лучше ответить ИМХО:

var arr = [];

$.post('block_ajax.php', {
    'action': 'set_layout',
    'listid': 123,
    'layout': arr.toString() // It'll be empty string "" if array is empty, otherwise if array has value(s) it will be a string of comma-separated values
}, function(data) {
    // ...
});

Примеры:

var layout = [].toString();// layout will be '' (empty string)
var layout = [1,2,3].toString();// layout will be string with comma-separated values '1,2,3' 

В конце, будь то пустая строка или строка, разделенная запятыми, она всегда будет размещена, просто преобразуйте ее в массив.

Back-end (пример PHP):

$layout = explode(',', $_POST['layout']);

Ответ 4

Попробуйте следующее:

(isset($_POST['layout'])) ? $_POST['layout'] : array();

чтобы получить новый пустой массив, если переданный массив пуст, "реальный" массив с данными в противном случае.

Ответ 5

Я думаю, что json поможет в таком случае

закодировать массив в js и отправить результат, затем декодировать его в php

но это займет некоторый ресурс

Ответ 6

Я решил это следующим образом, который, мне кажется, легче всего читать. Предположим, есть массив myArray, который может быть заполнен или пуст:

'requestParam': myArray.length === 0 ? '' : myArray

Даже когда пусто, jQuery не пропустит аргумент requestParam.