Ember.js: Abfrageparameter mit den Werten null oder undefiniert werden in Zeichenfolgen serialisiert

Erstellt am 20. März 2014  ·  21Kommentare  ·  Quelle: emberjs/ember.js

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.

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

Alle 21 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen