Как построить параметр List, используя JQuery из нескольких входов выбора? - PullRequest
0 голосов
/ 12 мая 2011

Мне нужно отправить строку JSON, содержащую список из 1 или более значений из формы множественного выбора.В предложенном мной решении JQuery я получаю все значения, выбранные в списке, но они возвращаются в виде отдельных параметров.

$(document).ready(function() {
  $("#fooForm").submit(function(event) {
    event.preventDefault();         
    var $form = $(this),
    loc = $form.find('input[name="location"]').val(),
    url = $form.attr('action'),
    keys = $('#people :selected').map(function(){return $(this).val();}).get();
    $.post(url, {people:keys, location:loc},
        function(data) {
          $("#result").html(data);
        }
    );
  });
});

<form id="fooForm" method="" action="/api/people/location">
  <input type="hidden" name="location" value="{{location}}" />
  <select id="people" multiple size=4>
   <option value="{{a.key}}">{{a.name}}</option>
   <option value="{{b.key}}">{{b.name}}</option>
   <option value="{{c.key}}">{{c.name}}</option>
   <option value="{{d.key}}">{{d.name}}</option>
  </select> 
  <input type="submit" value="Submit" />    
</form>

Это дает следующие параметры, если, скажем, три человекаselected:

location     91.001,-11.23
people[] agxzdXBlcmxhcnAtc2ty_foo
people[] agxzdXBlcmxhcnAtc2ty_spam
people[] agxzdXBlcmxhcnAtc2ty_eggs

Я ожидаю, что будет один параметр people, содержащий три ключевых значения.


UPDATE Вот самое элегантное решение, которое я нашелс:

$(document).ready(function() {
  $("#fooForm").submit(function(event) {
    event.preventDefault();         
var dataToBeSent = $("#fooFoorm").serialize();
var url = $("#fooForm").attr('action');
    $.post(url, dataToBeSent,
        function(data) {
          $("#result").html(data);
        }, "json"
    );
  });
});

<form id="fooForm" method="" action="/api/people/location">
  <input type="hidden" name="location" value="{{location}}" />
  <select name="people" multiple size=4>
   <option value="{{a.key}}">{{a.name}}</option>
   <option value="{{b.key}}">{{b.name}}</option>
   <option value="{{c.key}}">{{c.name}}</option>
   <option value="{{d.key}}">{{d.name}}</option>
  </select> 
  <input type="submit" value="Submit" />    
</form>

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Стандартный способ отправки списка в параметрах - это использование одного параметра для каждого элемента в списке (и тогда принято называть этот параметр «любым []», чтобы указать, что это список).

Кроме того, вы действительно должны использовать имя для вашего SELECT, а не идентификатор;у вас не должно быть нескольких элементов с одинаковым идентификатором на странице, а имя действительно является атрибутом для «именования» данных формы.

Более простым способом сделать то, что вы пытаетесь сделать, было быиспользовать метод сериализации jQuery.Это позволит вам сделать:

keys = $("#fooForm").serialize()

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

keys = ""
$('#people :selected').each(function(){
    keys += $(this).val() + ",";
});
// Strip off the trailing comma if present
0 голосов
/ 12 мая 2011

Возможно объединить массив ключей запятой?

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