これを追跡してくれた@denisnazarovに感謝します。
pingseñor@ machty
@machty私たちはこれにあなたの助けを使うことができます
ですから、昨夜このことに苦労した後、これが完全に望ましくないかどうかはわかりません。 次のコントローラーがあるとします。
App.MyController = Ember.Controller.extend({
queryParams: ['filters'],
filters: ['starred']
});
filters
をnull
してページを更新した場合、予想される動作は何ですか? null
をURLにセラライズしない場合、コントローラープロパティはデフォルト値に設定されます。
これは、偽の値と実際のfalseの値の間であいまいであったという以前の実装の問題に似ています。 今では、 defaultValue
とnull
または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
)、デフォルトで文字列を使用するという考えだったと思います。 これは、シリアル化のデフォルトが文字列であるため、 true
とfalse
が文字列バージョンになる理由を説明します。
プロパティを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
最も参考になるコメント
_誰かがGoogle経由でこれを見つけた場合。_
この問題は基本的に解決されていますが、クエリパラメータがコントローラに設定されていない場合、
null
が'null'
シリアル化されるというエッジケースが残っています。