O novo comportamento do JQuery 1.4 é uma escolha ruim de design?
-
24-09-2019 - |
Pergunta
Isso é um pouco discurso, mas também uma pergunta muito serosa. O jQuery mudou a serialização do param do Ajax da seguinte forma:
O jQuery 1.4 adiciona suporte para a serialização de parâmetros aninhados no jQuery.param, usando a abordagem popularizada pelo PHP e suportada pelo Ruby on Rails. Por exemplo, {foo: ["bar", "baz"]} será serializado como "foo [] = bar & foo [] = baz".
Você pegou isso?
Você chama seu parâmetro foo
. jQuery agora renomeia isso para foo[]
Atrás das suas costas, se o valor de Foo for uma matriz. A razão para isso é porque alguns PHP-ERs e Rubyists esperam que as APIs de terceiros renomeem as coisas para eles.
Me chame de antiquado, mas quando eu coloco algo em um mapa, com chave x
, Espero encontrar o valor em x
. Ou pelo menos tenha esse comportamento padrão com uma substituição opcional.
Até a documentação concorda comigo:
Se o valor for uma matriz, o jQuery serializa vários valores com a mesma tecla IE {foo: ["bar1", "bar2"]} se torna '& foo = bar1 & foo = bar2'.
Estou certo ao pensar que este é simplesmente um julgamento ruim da equipe do jQuery?
Solução
Na verdade está preenchendo uma grande inconsistência, E se Seu Deserializer está ciente da convenção e trabalha com ela bem. Isso faz com que uma variedade de coisas pareça diferente de uma coisa que é própria.
Velho:
foo: "bar"
mapeia para"foo=bar"
mapeia parafoo: "bar"
.foo: ["bar"]
mapeia para"foo=bar"
mapeia parafoo: "bar"
.foo: ["bar", "baz"]
mapeia para"foo=bar&foo=baz"
mapeia parafoo: ["bar", "baz"]
.
Novo:
foo: "bar"
mapeia para"foo=bar"
mapeia parafoo: "bar"
.foo: ["bar"]
mapeia para"foo[]=bar"
mapeia parafoo: ["bar"]
.foo: ["bar", "baz"]
mapeia para"foo[]=bar&foo[]=baz"
mapeia parafoo: ["bar", "baz"]
.
E agora tudo de volta bem e você não precisa se preocupar em receber dados da matriz ou dados que não sejam de marca, dependendo de quantos elementos estavam na matriz para começar. Para elegância máxima, foo: []
também deve serializar para foo[]
(Uma chave sem valor), indicando uma lista de 0-ara, mas o jQuery 1.4 não faz isso. Talvez deva. :)
Outras dicas
Discordo. A convenção antiga funcionou muito bem e continua funcionando bem para cavalos de trabalho da web clássicos como o Perl's CGI.pm
. Eu acho que o JQuery está apenas mudando uma convenção de trabalho para outra, e não sei que alguém de ambos os lados será tão feliz.