danke @denisnazarov für das Aufspüren.
ping señor @machty
@machty wir könnten deine
Nachdem ich letzte Nacht damit zu kämpfen hatte, bin ich mir nicht sicher, ob dies völlig unerwünscht ist. Angenommen, Sie haben den folgenden Controller.
App.MyController = Ember.Controller.extend({
queryParams: ['filters'],
filters: ['starred']
});
Wenn Sie filters
auf null
und die Seite aktualisieren, wie ist das erwartete Verhalten? Wenn Sie null
in die URL einbinden, wird die Controller-Eigenschaft auf ihren Standardwert gesetzt.
Dies ähnelt dem Problem in der vorherigen Implementierung, dass es zwischen falschen Werten und dem tatsächlichen Wert von false nicht eindeutig war. Jetzt scheint es mehrdeutig zwischen einem defaultValue
und null
oder undefined
.
Hier ist ein weiteres Beispiel mit booleschen Abfrageparametern: http://emberjs.jsbin.com/hamev/2/edit
Wenn der Standardwert auf null
, wird er durch Setzen auf true
oder false
tatsächlich auf die Zeichenfolgenversion gesetzt, 'true'
oder 'false'
.
@HeroicEric Also , was ist der zwingende Grund, es auf null
wenn es in seiner Lebenszeit der boolesche true
/ false
?
Das könnte falsch herausgekommen sein; Ich bin nur neugierig, was die Anwendungsfälle für all diese Serialisierungseckenfälle sind.
@machty Ich habe versucht, einen Anwendungsbeispiel im jsbin zu zeigen.
Ich zeige beispielsweise eine Liste von Benutzern an und möchte sie so filtern können, dass die Liste entweder Alle Benutzer, Administratorbenutzer oder Nicht-Administratorbenutzer enthält. Wenn ich Alle Benutzer sehen möchte, würde ich im Grunde nur den Filter entfernen.
Sind Situationen wie diese nicht das, wofür Abfrageparameter gedacht sind?
Im Idealfall wären die URLs ungefähr so:
/ users zeigt alle Benutzer an
/ users? admin = true zeigt alle
/ users? admin = false zeigt alle Benutzer an, die keine
@HeroicEric @machty Ich denke, die Idee war, dass wenn der defaultValue auf dem Controller nicht definiert wäre ( null
oder undefined
), standardmäßig Strings verwendet würden. Dies würde erklären, warum true
und false
als Zeichenfolgenversionen enden, da die Serialisierung standardmäßig Zeichenfolgen verwendet.
Ich denke, wenn Sie möchten, dass eine Eigenschaft auf null
wird, müssen wir den Typ von einem anderen Ort beziehen. @machty wäre dies ein guter Grund für die Möglichkeit, den Typ zur queryParams
-Konfiguration auf der Route hinzuzufügen?
Wenn wir dies hätten, könnten Sie den Typ als 'boolean
'und den Standardwert auf null
.
Ich habe dieses JSBin-Beispiel und frage mich, ob das, was ich sehe, mit diesem Problem zusammenhängt:
http://jsbin.com/dipajezi/1/edit
Grundsätzlich habe ich diesen foo
Abfrageparameter mit einem null
Standardwert, und wenn mein Modell-Hook zum ersten Mal aufgerufen wird, wenn die Anwendung gestartet wird, ist der Wert des Parameters null
. Wenn der Parameterwert null
, möchte ich diesen Parameter nicht zum Abfragen des Servers verwenden, da er "kein Wert" bedeutet.
Abfrage: ?page=1
Wenn ich auf die Schaltfläche NextPage klicke, wechsle ich erneut, aber diesmal ändere ich den Abfrageparameter page
. Diesmal hat der Abfrageparameter foo
einen Zeichenfolgenwert von "null"
, was etwas seltsam ist. In diesem Fall möchte ich immer noch einen Wert von null
, damit ich leicht überprüfen kann, ob der Parameter keinen Wert hat.
Abfrage: ?page=1
und nicht ?page=1&foo=null
Wenn ich schließlich auf die Schaltfläche ChangeFoo
klicke, gehe ich erneut über und setze diesmal den Wert des Abfrageparameters foo
auf einen beliebigen Wert. Jetzt, da der Wert nicht null ist, kann ich diesen Wert verwenden, um meine Abfragezeichenfolge zu erstellen.
Abfrage ?page=1&foo=3
@raytiley Habe gerade eine Notiz unter https://github.com/raytiley/ember.js/commit/26a3f8569edb58f8644ce4f9cec7000276c327a6#diff -0631ecfe6138cf2c2eb2d94369c3e846R1640 geschrieben.
Wenn ich ein qp explizit auf null
setze, wird es in eine Zeichenfolge im Modell-Hook umgewandelt. Dies scheint nicht richtig zu sein, da null
"kein Wert" darstellen sollte. Wenn eine Person die Nullzeichenfolge möchte, kann sie sie basierend auf dem Wert null
erstellen.
Andernfalls müssen Sie params.myQP && params.myQp !== "null"
ausführen, wenn Sie QPs übergeben möchten, die nur Werte enthalten.
Ich denke, dies ist veraltet, wird aber wieder geöffnet, wenn jemand das Problem in einem JSBin demonstrieren kann, der die folgenden ember.js verwendet: http://s3.amazonaws.com/machty/to_s3_uploads/ember-9fbe6c2a-c124-5c2e-0414 -f5ed36c2a1a2.js
_Wenn jemand dies über Google findet._
Das Problem ist im Grunde genommen gelöst, aber es bleibt ein Randfall bestehen, in dem, wenn der Abfrageparameter nicht auf dem Controller festgelegt ist, null
in 'null'
serialisiert wird.
var AnimalsController = Ember.Controller.extend({
queryParams: ['myCat']
// myCat: null // deliberately not set, to illustrate the issue
});
export default AnimalsController;
In Bezug auf den Anwendungsfall von
export default Ember.Controller.extend({
queryParams: [{
redevelopment: {
type: 'boolean'
}
}],
redevelopment: null
});
Working Ember Twiddle: https://ember-twiddle.com/3afa1091106a91ce2c1734ae2998bc3f?openFiles=controllers.application.js%2C&route=%2F%3Fredevelopment%3Dtrue
Seit wann erlauben QPs die Einstellung des Typs? Oder schlagen Sie nur eine neue API vor?
Es scheint undokumentiert zu sein. Wenn Sie hier schauen, scheint es, dass es überschrieben werden kann.
Oh, das ist schön!
Vielen Dank, @allthesignals , es ist so hilfreich für Ihre Lösung.
Wie wäre es mit dieser Lösung?
{ key: undefined }
bis ?
_ (nicht enthalten) _
{ key: null }
bis ?key
{ key: '' }
bis ?key=
{ key: 'null' }
bis ?key=null
Gute Liste!
Ich würde dafür stimmen:
{ key: undefined }
bis [nothing]
_ (nicht enthalten) _
{ key: null }
bis [nothing]
_ (nicht enthalten) _
{ key: '' }
bis ?key
{ key: 'null' }
bis ?key=null
und möglicherweise auch:
{ key: false }
bis [nothing]
_ (nicht enthalten) _
{ key: true }
bis ?key
Hilfreichster Kommentar
_Wenn jemand dies über Google findet._
Das Problem ist im Grunde genommen gelöst, aber es bleibt ein Randfall bestehen, in dem, wenn der Abfrageparameter nicht auf dem Controller festgelegt ist,
null
in'null'
serialisiert wird.