Ember.js: Les paramètres de requête avec des valeurs nulles ou non définies sont sérialisés en chaînes

Créé le 20 mars 2014  ·  21Commentaires  ·  Source: emberjs/ember.js

Commentaire le plus utile

_ Au cas où quelqu'un trouverait cela via Google._

Le problème est fondamentalement résolu, mais il reste un cas limite où si le paramètre de requête n'est pas défini sur le contrôleur, il sérialisera null en 'null' .

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

Tous les 21 commentaires

merci @denisnazarov pour avoir

ping señor @machty

@machty, nous pourrions utiliser votre aide à ce sujet

Donc, après avoir lutté avec ça la nuit dernière, je ne suis pas sûr que ce soit totalement indésirable. Disons que vous avez le contrôleur suivant.

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

Si vous définissez filters sur null et actualisez la page, quel est le comportement attendu? Si vous ne seralisez pas null dans l'url, la propriété du contrôleur sera définie sur sa valeur par défaut.

Ceci est similaire au problème de l'implémentation précédente qui était ambigu entre les valeurs fausses et la valeur réelle de false. Maintenant, il semble ambigu entre un defaultValue et null ou undefined .

Voici un autre exemple utilisant des paramètres de requête booléens: http://emberjs.jsbin.com/hamev/2/edit

Si la valeur par défaut est définie sur null , la définir sur true ou false définit en fait sur la version chaîne, 'true' ou 'false' .

@HeroicEric alors quelle est la raison impérieuse de le définir sur null si dans sa durée de vie ce sera le booléen true / false ?

Cela aurait pu mal tourner; Je suis juste curieux de savoir quels sont les cas d'utilisation pour tous ces cas de coin de sérialisation.

@machty J'ai essayé de montrer un exemple de cas d'utilisation dans le jsbin.

Par exemple, j'affiche une liste d'utilisateurs et je souhaite pouvoir les filtrer afin que la liste contienne tous les utilisateurs, les utilisateurs administrateurs ou les utilisateurs non administrateurs. Lorsque je veux voir tous les utilisateurs, je supprimerais simplement le filtre.

Les situations comme celle-ci ne sont-elles pas destinées aux paramètres de requête?

Idéalement, les URL seraient quelque chose comme ceci:

/ users montre tous les utilisateurs
/ users? admin = true montre tous les administrateurs
/ users? admin = false affiche tous les utilisateurs qui ne sont pas administrateurs

@HeroicEric @machty Je pense que l'idée était que si la valeur par défaut sur le contrôleur n'était pas définie ( null ou undefined ), il utiliserait par défaut des chaînes. Cela expliquerait pourquoi true et false finissent comme leurs versions de chaîne puisque la sérialisation est par défaut des chaînes.

Je pense que si vous voulez qu'une propriété soit définie sur null nous devons obtenir le type ailleurs. @machty serait-ce une bonne raison pour la possibilité d'ajouter le type à la configuration queryParams sur la route?

Si nous avions cela, vous pourriez définir le type comme 'boolean 'et définir la valeur par défaut sur null .

J'ai cet exemple JSBin et je me demande si ce que je vois est lié à ce problème:

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

Fondamentalement, j'ai ce paramètre de requête foo avec une valeur par défaut null , et la première fois que mon hook de modèle est appelé au démarrage de l'application, la valeur du paramètre est null . Lorsque la valeur du paramètre est null , je ne veux pas utiliser ce paramètre pour interroger le serveur, car cela signifie "aucune valeur".

Requête: ?page=1

Lorsque je clique sur le bouton NextPage, je passe à nouveau mais cette fois je change le paramètre de requête page . Cette fois, le paramètre de requête foo a une valeur de chaîne de "null" , ce qui est assez bizarre. Dans ce cas, je voudrais toujours avoir une valeur de null , afin que je puisse facilement vérifier que le paramètre n'a pas de valeur.

Requête: ?page=1 et non ?page=1&foo=null

Enfin, lorsque je clique sur le bouton ChangeFoo , je passe à nouveau, cette fois en définissant la valeur du paramètre de requête foo sur n'importe quelle valeur. Maintenant que la valeur n'est pas nulle, je peux utiliser cette valeur pour construire ma chaîne de requête.

Requête ?page=1&foo=3

@raytiley vient d'écrire une note sur https://github.com/raytiley/ember.js/commit/26a3f8569edb58f8644ce4f9cec7000276c327a6#diff -0631ecfe6138cf2c2eb2d94369c3e846R1640.

Si je règle explicitement un qp sur null , il est converti en une chaîne dans le hook de modèle. Cela ne semble pas correct, puisque null devrait représenter "aucune valeur", et si un individu veut la chaîne nulle, alors il peut la créer en fonction de la valeur null .

Sinon, si vous voulez passer des QP qui n'ont que des valeurs, vous devez faire params.myQP && params.myQp !== "null" ..

Je pense que c'est obsolète mais rouvrira si quelqu'un peut démontrer le problème dans un JSBin qui utilise le ember.js suivant: http://s3.amazonaws.com/machty/to_s3_uploads/ember-9fbe6c2a-c124-5c2e-0414 -f5ed36c2a1a2.js

_ Au cas où quelqu'un trouverait cela via Google._

Le problème est fondamentalement résolu, mais il reste un cas limite où si le paramètre de requête n'est pas défini sur le contrôleur, il sérialisera null en 'null' .

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

En ce qui @HeroicEric , le contrôleur ne saura pas comment sérialiser intelligemment en fonction de ce que la valeur sera dans sa vie. Cela semble fonctionner dans la version la plus récente (2.6):

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

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

Depuis quand les QP permettent-ils de définir le type? Ou proposez-vous simplement une nouvelle API?

Cela semble non documenté. En regardant ici , il semble que cela puisse être annulé.

Oh c'est gentil!

Merci, @allthesignals , c'est tellement utile pour votre solution.

Et cette solution?

{ key: undefined } à ? _ (non inclus) _
{ key: null } à ?key
{ key: '' } à ?key=
{ key: 'null' } à ?key=null

Bonne liste!

Je voterais pour ceci:
{ key: undefined } à [nothing] _ (non inclus) _
{ key: null } à [nothing] _ (non inclus) _
{ key: '' } à ?key
{ key: 'null' } à ?key=null

et éventuellement aussi:

{ key: false } à [nothing] _ (non inclus) _
{ key: true } à ?key

Cette page vous a été utile?
0 / 5 - 0 notes