Является ли новое поведение jQuery 1.4 плохим выбором дизайна? - PullRequest
0 голосов
/ 02 февраля 2010

Это немного напыщенная речь, но также очень серьезный вопрос. jQuery изменил сериализацию параметров ajax следующим образом:

В jQuery 1.4 добавлена ​​поддержка сериализации вложенных параметров в jQuery.param с использованием подхода, популярного в PHP и поддерживаемого Ruby on Rails. Например, {foo: ["bar", "baz"]} будет сериализовано как "foo [] = bar & foo [] = baz".

Ты это понял?

Вы называете свой параметр foo. jQuery теперь переименовывает это в foo[] за вашей спиной, если значение foo является массивом. Причина этого в том, что некоторые PHP-пользователи и Rubyists ожидают, что сторонние API переименуют вещи для них.

Назовите меня старомодным, но когда я помещаю что-то в карту, с ключом x, я ожидаю найти значение в x. Или, по крайней мере, это поведение по умолчанию с необязательным переопределением.

Даже со мной согласна документация:

Если значение является массивом, jQuery сериализует несколько значений с одинаковыми ключ т.е. {foo: ["bar1", "bar2"]} становится '& foo = bar1 & foo = bar2'.

Правильно ли я считаю, что это просто неправильное решение от команды jQuery?

Ответы [ 2 ]

8 голосов
/ 02 февраля 2010

Это на самом деле заполняет существенное несоответствие, , если , ваш десериализатор знает о соглашении и прекрасно с ним работает. Это делает массив из одного предмета отличным от того, что он сам по себе.

Старый:

  • foo: "bar" отображается на "foo=bar" отображается на foo: "bar".
  • foo: ["bar"] отображается на "foo=bar" отображается на foo: "bar".
  • foo: ["bar", "baz"] отображается на "foo=bar&foo=baz" отображается на foo: ["bar", "baz"].

Новое:

  • foo: "bar" отображается на "foo=bar" отображается на foo: "bar".
  • foo: ["bar"] сопоставляется с "foo[]=bar" сопоставляется с foo: ["bar"].
  • foo: ["bar", "baz"] отображается на "foo[]=bar&foo[]=baz" отображается на foo: ["bar", "baz"].

И теперь все идет хорошо, и вам не нужно беспокоиться о получении данных массива или данных вне массива, в зависимости от того, сколько элементов было в массиве для начала. Для максимальной элегантности foo: [] также следует сериализовать в foo[] (ключ без значения), что указывает на 0-й список, но jQuery 1.4 этого не делает. Может быть, так и должно быть. :)

1 голос
/ 02 февраля 2010

Я не согласен. Старое соглашение работало просто отлично и продолжает работать для классических веб-рабочих лошадок, таких как Perl's CGI.pm. Я думаю, что jQuery просто переключает одно рабочее соглашение на другое, и я не знаю, что кто-либо с обеих сторон будет так счастлив.

...