Ember.js: Os parâmetros de consulta com valores nulos ou indefinidos são serializados em strings

Criado em 20 mar. 2014  ·  21Comentários  ·  Fonte: emberjs/ember.js

Comentários muito úteis

_Caso alguém encontre isso através do Google._

O problema está basicamente resolvido, mas permanece um caso extremo em que, se o parâmetro de consulta não estiver definido no controlador, ele serializará null em 'null' .

var AnimalsController = Ember.Controller.extend({

  queryParams: ['myCat']
  // myCat: null // deliberately not set, to illustrate the issue

});

export default AnimalsController;

Todos 21 comentários

obrigado @denisnazarov por rastrear este.

ping señor @machty

@machty , poderíamos usar sua ajuda nisso

Depois de lutar com isso na noite passada, não tenho certeza se isso é totalmente indesejável. Digamos que você tenha o seguinte controlador.

App.MyController = Ember.Controller.extend({
  queryParams: ['filters'],
  filters: ['starred']
});

Se você definir filters para null e atualizar a página, qual é o comportamento esperado? Se você não serializar null no url, a propriedade do controlador será configurada para seu valor padrão.

Isso é semelhante ao problema na implementação anterior de que era ambíguo entre valores falsos e o valor real de falso. Agora parece ambíguo entre defaultValue e null ou undefined .

Aqui está outro exemplo usando parâmetros de consulta booleanos: http://emberjs.jsbin.com/hamev/2/edit

Se o valor padrão for definido como null , defini-lo como true ou false realmente o definirá como a versão da string, 'true' ou 'false' .

@HeroicEric então qual é a razão convincente para defini-lo como null se em sua vida for o booleano true / false ?

Isso pode ter saído errado; Estou apenas curioso para saber quais são os casos de uso para todos esses casos de canto de serialização.

@machty Tentei mostrar um exemplo de caso de uso no jsbin.

Por exemplo, estou exibindo uma lista de usuários e quero poder filtrá-los para que a lista contenha Todos os usuários, Usuários administradores ou Usuários não administradores. Quando eu quiser ver Todos os usuários, basicamente removerei o filtro.

Situações como essa não são o objetivo dos parâmetros de consulta?

Idealmente, os URLs seriam mais ou menos assim:

/ users mostra todos os usuários
/ users? admin = true mostra todos os administradores
/ users? admin = false mostra todos os usuários que não são administradores

@HeroicEric @machty Acho que a ideia era que se o defaultValue no controlador não fosse definido ( null ou undefined ), o padrão seria usar strings. Isso explicaria por que true e false terminam como suas versões de string, uma vez que o padrão de serialização é strings.

Acho que se você deseja que uma propriedade seja definida como null , precisamos obter o tipo de outro lugar. @machty seria uma boa razão para adicionar o tipo à configuração queryParams na rota?

Se tivéssemos isso, você poderia definir o tipo como 'boolean 'e definir o padrão como null .

Tenho este exemplo JSBin e me pergunto se o que estou vendo está relacionado a este problema:

http://jsbin.com/dipajezi/1/edit

Basicamente, eu tenho este parâmetro de consulta foo com um valor padrão null e a primeira vez que meu gancho de modelo é chamado quando o aplicativo é iniciado, o valor do parâmetro é null . Quando o valor do parâmetro é null , não quero usar este parâmetro para consultar o servidor, porque significa "sem valor".

Consulta: ?page=1

Quando clico no botão NextPage, faço a transição novamente, mas desta vez altero o parâmetro de consulta page . Desta vez, o parâmetro de consulta foo tem um valor de string de "null" , o que é meio estranho. Nesse caso, eu ainda gostaria de ter um valor de null , para que possa verificar facilmente se o parâmetro não tem um valor.

Consulta: ?page=1 e não ?page=1&foo=null

Finalmente, quando clico no botão ChangeFoo , faço a transição novamente, desta vez definindo o valor do parâmetro de consulta foo para qualquer valor. Agora que o valor não é nulo, posso usar esse valor para construir minha string de consulta.

Consulta ?page=1&foo=3

@raytiley Acabei de escrever uma nota em https://github.com/raytiley/ember.js/commit/26a3f8569edb58f8644ce4f9cec7000276c327a6#diff -0631ecfe6138cf2c2eb2d94369c3e846R1640.

Se eu definir um qp como null explicitamente, ele será convertido em uma string no gancho do modelo. Isso não parece certo, já que null deve representar "nenhum valor", e se um indivíduo quiser a string nula, ele pode criá-la com base no valor null .

Caso contrário, se você deseja passar QPs que têm apenas valores, você deve fazer params.myQP && params.myQp !== "null" ..

Acho que está desatualizado, mas reabrirá se alguém puder demonstrar o problema em um JSBin que usa o seguinte ember.js: http://s3.amazonaws.com/machty/to_s3_uploads/ember-9fbe6c2a-c124-5c2e-0414 -f5ed36c2a1a2.js

_Caso alguém encontre isso através do Google._

O problema está basicamente resolvido, mas permanece um caso extremo em que, se o parâmetro de consulta não estiver definido no controlador, ele serializará null em 'null' .

var AnimalsController = Ember.Controller.extend({

  queryParams: ['myCat']
  // myCat: null // deliberately not set, to illustrate the issue

});

export default AnimalsController;

Em relação ao caso de uso de

export default Ember.Controller.extend({
  queryParams: [{ 
     redevelopment: { 
         type: 'boolean' 
     } 
  }],
  redevelopment: null
});

Trabalhando ember twiddle: https://ember-twiddle.com/3afa1091106a91ce2c1734ae2998bc3f?openFiles=controllers.application.js%2C&route=%2F%3Fredevelopment%3Dtrue

Desde quando os QPs permitem definir o tipo? Ou você está apenas propondo uma nova API?

Parece não ter documentos. Olhando aqui , parece que pode ser substituído.

Oh, isso é legal!

Obrigado, @allthesignals , é muito útil para sua solução.

Que tal essa solução?

{ key: undefined } a ? _ (não incluído) _
{ key: null } a ?key
{ key: '' } a ?key=
{ key: 'null' } a ?key=null

Boa lista!

Eu votaria nisso:
{ key: undefined } a [nothing] _ (não incluído) _
{ key: null } a [nothing] _ (não incluído) _
{ key: '' } a ?key
{ key: 'null' } a ?key=null

e possivelmente também:

{ key: false } a [nothing] _ (não incluído) _
{ key: true } a ?key

Esta página foi útil?
0 / 5 - 0 avaliações