JQuery удаляет пустые массивы при отправке - PullRequest
20 голосов
/ 08 июля 2011

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

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

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

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

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

Ответы [ 5 ]

9 голосов
/ 13 августа 2015

У нашей организации есть два подхода к проблеме:

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

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

2 голосов
/ 13 мая 2018

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']);
0 голосов
/ 03 сентября 2012

Попробуйте:

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

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

0 голосов
/ 31 июля 2015

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

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

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

0 голосов
/ 08 июля 2011

РЕДАКТИРОВАТЬ: см. Ответ Люка для лучшего решения: https://stackoverflow.com/a/31996181/827437

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

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

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

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

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