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
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'
.