Ember.js: Los parámetros de consulta con valores nulos o indefinidos se serializan en cadenas

Creado en 20 mar. 2014  ·  21Comentarios  ·  Fuente: emberjs/ember.js

Comentario más útil

_En caso de que alguien encuentre esto a través de Google._

El problema está básicamente resuelto, pero queda un caso extremo en el que si el parámetro de consulta no está configurado en el controlador, serializará null en 'null' .

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

Todos 21 comentarios

gracias @denisnazarov por rastrear este.

ping señor @machty

@machty nos vendría bien tu ayuda en esto

Entonces, después de luchar con esto anoche, no estoy seguro de que sea totalmente indeseable. Digamos que tiene el siguiente controlador.

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

Si establece filters en null y actualiza la página, ¿cuál es el comportamiento esperado? Si no seraliza null en la URL, la propiedad del controlador se establecerá en su valor predeterminado.

Esto es similar al problema de la implementación anterior de que era ambiguo entre los valores falsos y el valor real de falso. Ahora parece ambiguo entre defaultValue y null o undefined .

Aquí hay otro ejemplo que usa parámetros de consulta booleanos: http://emberjs.jsbin.com/hamev/2/edit

Si el valor predeterminado se establece en null , establecerlo en true o false realidad lo establece en la versión de cadena, 'true' o 'false' .

@HeroicEric, entonces, ¿cuál es la razón de peso para configurarlo en null si en su vida será el booleano true / false ?

Eso pudo haber salido mal; Solo tengo curiosidad por saber cuáles son los casos de uso para todos estos casos de esquina de serialización.

@machty Traté de mostrar un caso de uso de ejemplo en jsbin.

Por ejemplo, estoy mostrando una lista de usuarios y quiero poder filtrarlos para que la lista contenga Todos los usuarios, Usuarios administradores o Usuarios no administradores. Cuando quiero ver Todos los usuarios, básicamente solo eliminaré el filtro.

¿No son situaciones como esta para lo que están destinados los parámetros de consulta?

Idealmente, las URL serían algo como esto:

/ users muestra todos los usuarios
/ users? admin = true muestra todos los administradores
/ users? admin = false muestra todos los usuarios que no son administradores

@HeroicEric @machty Creo que la idea era que si el valor predeterminado en el controlador no estaba definido ( null o undefined ), por defecto usaría cadenas. Esto explicaría por qué true y false terminan siendo sus versiones de cadena, ya que la serialización tiene por defecto cadenas.

Creo que si desea que una propiedad se establezca en null entonces debemos obtener el tipo de otro lugar. @machty, ¿ sería esta una buena razón para poder agregar el tipo a la configuración queryParams en la ruta?

Si tuviéramos esto, entonces podría establecer el tipo como 'boolean 'y establecer el valor predeterminado en null .

Tengo este ejemplo de JSBin y me pregunto si lo que veo está relacionado con este problema:

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

Básicamente, tengo este parámetro de consulta foo con un valor predeterminado null , y la primera vez que se llama a mi modelo de gancho cuando se inicia la aplicación, el valor del parámetro es null . Cuando el valor del parámetro es null , no quiero usar este parámetro para consultar el servidor, porque significa "sin valor".

Consulta: ?page=1

Cuando hago clic en el botón NextPage, hago la transición nuevamente, pero esta vez cambio el parámetro de consulta page . Esta vez, el parámetro de consulta foo tiene un valor de cadena de "null" , lo cual es un poco extraño. En este caso, todavía querría tener un valor de null , para poder verificar fácilmente que el parámetro no tiene un valor.

Consulta: ?page=1 y no ?page=1&foo=null

Finalmente, cuando hago clic en el botón ChangeFoo , hago la transición nuevamente, esta vez estableciendo el valor del parámetro de consulta foo en cualquier valor. Ahora que el valor no es nulo, puedo usar este valor para construir mi cadena de consulta.

Consulta ?page=1&foo=3

@raytiley Acaba de escribir una nota en https://github.com/raytiley/ember.js/commit/26a3f8569edb58f8644ce4f9cec7000276c327a6#diff -0631ecfe6138cf2c2eb2d94369c3e846R1640.

Si establezco un qp en null explícitamente, entonces se convierte en una cadena en el gancho del modelo. Esto no parece correcto, ya que null debería representar "ningún valor", y si un individuo quiere la cadena nula, entonces puede crearla basándose en el valor null .

De lo contrario, si desea pasar QP que solo tienen valores, debe hacer params.myQP && params.myQp !== "null" ..

Creo que esto está desactualizado, pero se volverá a abrir si alguien puede demostrar el problema en un JSBin que usa el siguiente ember.js: http://s3.amazonaws.com/machty/to_s3_uploads/ember-9fbe6c2a-c124-5c2e-0414 -f5ed36c2a1a2.js

_En caso de que alguien encuentre esto a través de Google._

El problema está básicamente resuelto, pero queda un caso extremo en el que si el parámetro de consulta no está configurado en el controlador, serializará null en 'null' .

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

Con respecto al caso de uso de

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

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

¿Desde cuándo los QP permiten configurar el tipo? ¿O simplemente está proponiendo una nueva API?

Parece estar indocumentado. Mirando aquí , parece que se puede anular.

¡Oh eso es agradable!

Gracias, @allthesignals , es muy útil para su solución.

¿Qué tal esta solución?

{ key: undefined } a ? _ (no incluido) _
{ key: null } a ?key
{ key: '' } a ?key=
{ key: 'null' } a ?key=null

¡Buena lista!

Votaría por esto:
{ key: undefined } a [nothing] _ (no incluido) _
{ key: null } a [nothing] _ (no incluido) _
{ key: '' } a ?key
{ key: 'null' } a ?key=null

y posiblemente también:

{ key: false } a [nothing] _ (no incluido) _
{ key: true } a ?key

¿Fue útil esta página
0 / 5 - 0 calificaciones