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