2013-02-27 1 views
0

У меня есть форма с глубокими многомерными входами, как так:

<form id="theForm"> 
<input type='text' name='one[two][three][]' /> 
<input type='text' name='one[two][three][]' /> 
<input type='text' name='four[five][six][seven]' /> 
<input type='text' name='eight[nine][ten]' /> 
</form> 

Я пытаюсь отправить значение с помощью AJAX в том же формате, если форма была отправлена как обычно. Я имею в виду, что если бы я нажал кнопку отправки, на PHP, $ _POST выглядел бы так. Это то, что я хочу:

array('one' => array('two' => array('three'=>array([0] => "", [1] => ""))), 
     'four' => array('five' => array ('six' => array('seven' => ""))), 
     'eight' => array('nine' => array('ten' => ""))) 
    ) 

Я по существу пытаюсь представить AJAX форму представления. Когда я

$("#theForm").serializeArray() 

И посыла, что за $.post() мой $ _POST выглядит следующим образом:

array([0] => array("name" => string "one[two][three][]", value=>"") 
     [1] => array("name" => string "one[two][three][]", value=>"") 
     [2] => array("name" => string "four[five][six][seven]", value=>"") 
     [3] => array("name" => string "eight[nine][ten]", value=>"") 
    ) 

Это не имеет смысла для меня. Мне нужно сохранить описанную выше многомерную структуру. Полагаю, я мог бы пройти через массив и нарезать струну, чтобы воссоздать то, что мне нужно, но это кажется мне для меня сумасшедшим. Является ли удобный способ jQuery для этого?

Я прочитал другие сообщения о том, как jQuery может отправлять многомерные массивы просто отлично, поэтому, может быть, вопрос, который мне нужно задать, - как я могу извлечь данные формы, сохраняя его в многомерном массиве?

+1

[Проверьте этот ответ] (http://stackoverflow.com/a/1186309/575527). Это превращает форму в объект JS, который может сохранять структуру ключа-значения массива формы, правильно поворачивая элементы к объектам и массивам. – Joseph

+0

Можете ли вы показать код, куда вы отправляете данные через AJAX? –

ответ

4

Я думаю, когда вы делаете AJAX звонок Вы делаете:

data: {data: $("#theForm").serializeArray()} 

Не надо этого делать, просто установить data к значению serializeArray.

data: $("#theForm").serializeArray() 

EDIT: Вы сказали, что вы используете $.post, и я предполагаю, что вы делаете это:

$.post('/your/url', {data: $("#theForm").serializeArray()}, function(){}); 

Для того, чтобы работать, вы должны сделать это таким образом:

$.post('/your/url', $("#theForm").serializeArray(), function(){}); 
+0

Это не то, что я делаю, и не проблема. Проблема в том, что serializeArray не структурирует данные в соответствии с различными уровнями массива. Он «плоский», с атрибутом «name», установленным на «все, что [имя] [имя] [было]». Кажется, единственный способ сделать то, что я хочу, - это просто сделать это самостоятельно. –

+2

@ parker.sikand: Это именно то, что вы делаете, хотя я подозреваю, что вы используете '$ .post' вместо' $ .ajax'.'serializeArray' возвращает массив объектов с ключами' name' и 'value'. Когда он передается '$ .param' (который выполняется автоматически jQuery), он преобразуется в строку запроса в ожидаемом формате. Если вы отправляете данные типа '{data: $ (" # theForm "). SerializeArray()}', то он не будет отправлен правильно. –

+0

Вы были совершенно правы, я извиняюсь за свое невежество. –

2

Ответ получен полностью. В качестве примечания, если вам нужно добавить другие данные в массив данных сообщения, вам просто нужно нажать его на массив в формате {name: "", value: ""}

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

var data = $("#myForm").serializeArray(); 
data.push({name: "btnVal", value="button_a"}); 

И убедитесь, что вы размещаете как:

$.post("/some/url", data, function(){}); 
Смежные вопросы