Ember.js: 値がnullまたは未定義のクエリパラメータは文字列にシリアル化されます

作成日 2014年03月20日  ·  21コメント  ·  ソース: emberjs/ember.js

最も参考になるコメント

_誰かがGoogle経由でこれを見つけた場合。_

この問題は基本的に解決されていますが、クエリパラメータがコントローラに設定されていない場合、 null'null'シリアル化されるというエッジケースが残っています。

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

全てのコメント21件

これを追跡してくれた@denisnazarovに感謝します。

pingseñor@ machty

@machty私たちはこれにあなたの助けを使うことができます

ですから、昨夜このことに苦労した後、これが完全に望ましくないかどうかはわかりません。 次のコントローラーがあるとします。

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

filtersnullしてページを更新した場合、予想される動作は何ですか? nullをURLにセラライズしない場合、コントローラープロパティはデフォルト値に設定されます。

これは、偽の値と実際のfalseの値の間であいまいであったという以前の実装の問題に似ています。 今では、 defaultValuenullまたはundefined間があいまいになっているようです。

ブールクエリパラメータを使用した別の例を次に示します。http

デフォルト値がnullに設定されている場合、 trueまたはfalseに設定すると、実際には文字列バージョン'true'または'false'

@HeroicEricでは、それがブール値のtrue / falseになる場合、 nullに設定する説得力のある理由は何ですか?

それは間違っていたかもしれません。 これらすべてのシリアル化コーナーケースのユースケースが何であるかを知りたいだけです。

@machtyjsbinでのユースケースの例を示してみました。

たとえば、ユーザーのリストを表示していて、リストにすべてのユーザー、管理者ユーザー、または非管理者ユーザーのいずれかが含まれるようにユーザーをフィルタリングできるようにしたいとします。 すべてのユーザーを表示したい場合は、基本的にフィルターを削除するだけです。

このような状況は、クエリパラメータの目的ではありませんか?

理想的には、URLは次のようになります。

/ usersはすべての
/ users?admin = trueは、すべての管理者を表示します
/ users?admin = falseは、管理者ではないすべてのユーザーを表示します

@HeroicEric @machtyコントローラーのdefaultValueが定義されていない場合( nullまたはundefined )、デフォルトで文字列を使用するという考えだったと思います。 これは、シリアル化のデフォルトが文字列であるため、 truefalseが文字列バージョンになる理由を説明します。

プロパティをnull設定する場合は、別の場所から型を取得する必要があると思います。 @machtyは、ルート上のqueryParams構成にタイプを追加できる理由として適切でしょうか?

これがある場合は、タイプを'boolean 'に設定し、デフォルトをnullます。

私はこのJSBinの例を持っています、そして私が見ているものがこの問題に関連しているのだろうかと思います:

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

基本的に、このfooクエリパラメーターにはnullデフォルト値があり、アプリケーションの起動時にモデルフックが最初に呼び出されたとき、パラメーターの値はnull 。 パラメータ値がnull場合、「値なし」を意味するため、このパラメータを使用してサーバーにクエリを実行したくありません。

クエリ: ?page=1

NextPageボタンをクリックすると、再び遷移しますが、今回はpageクエリパラメータを変更します。 今回は、 fooクエリパラメータの文字列値が"null" 、これはちょっと奇妙です。 この場合でも、 nullの値が必要なので、パラメーターに値がないことを簡単に確認できます。

クエリ: ?page=1ではなく?page=1&foo=null

最後に、 ChangeFooボタンをクリックすると、もう一度遷移します。今回は、 fooクエリパラメータの値を任意の値に設定します。 値がnullではなくなったので、この値を使用してクエリ文字列を作成できます。

クエリ?page=1&foo=3

@raytileyhttps //github.com/raytiley/ember.js/commit/26a3f8569edb58f8644ce4f9cec7000276c327a6#diff-0631ecfe6138cf2c2eb2d94369c3e846R1640にメモを書きました。

qpを明示的にnullに設定すると、モデルフックの文字列にキャストされます。 nullは「値なし」を表す必要があるため、これは正しくないようです。個人がnull文字列を必要とする場合は、値nullに基づいて文字列を作成できます。

それ以外の場合、値のみを持つQPを渡したい場合は、 params.myQP && params.myQp !== "null"を実行する必要があります。

これは時代遅れだと思いますが、誰かが次のember.jsを使用するJSBinで問題を実証できれば、再開します: http ://s3.amazonaws.com/machty/to_s3_uploads/ember-9fbe6c2a-c124-5c2e-0414

_誰かがGoogle経由でこれを見つけた場合。_

この問題は基本的に解決されていますが、クエリパラメータがコントローラに設定されていない場合、 null'null'シリアル化されるというエッジケースが残っています。

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

@HeroicEricのユースケースに関して、コントローラーは、その存続期間中の値に基づいてインテリジェントにシリアル化する方法を知りません。 これは最新バージョン(2.6)で機能しているようです。

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

残り火の回転: https ://ember-twiddle.com/3afa1091106a91ce2c1734ae2998bc3f?openFiles route =%2F%3Fredevelopment%3Dtrue

QPはいつからタイプの設定を許可しますか? それとも、新しいAPIを提案しているだけですか?

文書化されていないようです。 ここを見る

ああ、いいですね!

おかげで、 @ allthesignals 、それはあなたの解決策にとても役立ちます。

このソリューションはどうですか?

{ key: undefined }から? _(含まれていません)_
{ key: null }から?key
{ key: '' }から?key=
{ key: 'null' }から?key=null

良いリスト!

私はこれに投票します:
{ key: undefined }から[nothing] _(含まれていません)_
{ key: null }から[nothing] _(含まれていません)_
{ key: '' }から?key
{ key: 'null' }から?key=null

そしておそらくまた:

{ key: false }から[nothing] _(含まれていません)_
{ key: true }から?key

このページは役に立ちましたか?
0 / 5 - 0 評価