Ember.js: Parameter kueri dengan nilai null atau undefined diserialkan menjadi string

Dibuat pada 20 Mar 2014  ·  21Komentar  ·  Sumber: emberjs/ember.js

Komentar yang paling membantu

_Jika ada yang menemukan ini melalui Google._

Masalah pada dasarnya terpecahkan, tetapi kasus tepi tetap di mana jika parameter kueri tidak disetel pada pengontrol itu akan membuat serial null menjadi 'null' .

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

Semua 21 komentar

terima kasih @denisnazarov untuk melacak yang satu ini.

ping señor @achty

@machty kami dapat menggunakan bantuan Anda dalam hal ini

Jadi setelah berjuang dengan ini tadi malam, saya tidak yakin bahwa ini sama sekali tidak diinginkan. Katakanlah Anda memiliki pengontrol berikut.

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

Jika Anda menyetel filters menjadi null dan menyegarkan halaman, perilaku apa yang diharapkan? Jika Anda tidak memasukkan null ke dalam url, properti controller akan disetel ke nilai defaultnya.

Hal ini mirip dengan masalah pada implementasi sebelumnya yaitu ambigu antara nilai falsy dan nilai false yang sebenarnya. Sekarang tampaknya ambigu antara defaultValue dan null atau undefined .

Berikut contoh lain menggunakan parameter kueri boolean: http://emberjs.jsbin.com/hamev/2/edit

Jika nilai default disetel ke null , menyetelnya ke true atau false sebenarnya menyetelnya ke versi string, 'true' atau 'false' .

@HeroicEric jadi apa alasan kuat untuk menyetelnya ke null jika dalam waktu hidup itu akan menjadi boolean true / false ?

Itu mungkin salah; Saya hanya ingin tahu apa kasus penggunaan untuk semua kasus sudut serialisasi ini.

@machty Saya mencoba untuk menunjukkan contoh use case di jsbin.

Misalnya, saya menampilkan daftar pengguna dan saya ingin dapat memfilter mereka sehingga daftar tersebut berisi Semua Pengguna, Pengguna Admin, atau Pengguna Non-Admin. Ketika saya ingin melihat Semua Pengguna, saya pada dasarnya hanya akan menghapus filter.

Apakah situasi seperti ini bukan untuk apa parameter kueri dimaksudkan?

Idealnya, URL-nya akan seperti ini:

/ pengguna menunjukkan semua pengguna
/ users? admin = true menunjukkan semua admin
/ users? admin = false menunjukkan semua pengguna yang bukan admin

@HeroicEric @machty Saya pikir idenya adalah bahwa jika defaultValue pada controller tidak ditentukan ( null atau undefined ) maka defaultnya akan menggunakan string. Ini akan menjelaskan mengapa true dan false berakhir sebagai versi string mereka karena serialisasi default ke string.

Saya pikir jika Anda ingin properti disetel ke null maka kita perlu mendapatkan jenisnya dari tempat lain. @achty apakah ini alasan yang bagus untuk kemampuan menambahkan tipe ke konfigurasi queryParams pada rute?

Jika kami memiliki ini maka Anda dapat mengatur jenis sebagai 'boolean 'dan mengatur default ke null .

Saya memiliki contoh JSBin ini, dan saya bertanya-tanya apakah yang saya lihat terkait dengan masalah ini:

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

Pada dasarnya, saya memiliki ini foo parameter permintaan dengan null nilai default, dan pertama kalinya Model kait saya dipanggil ketika aplikasi dimulai, nilai parameter adalah null . Ketika nilai parameter adalah null , saya tidak ingin menggunakan parameter ini untuk menanyakan server, karena artinya "tidak ada nilai".

Kueri: ?page=1

Ketika saya mengklik tombol NextPage, saya bertransisi lagi tetapi kali ini saya mengubah parameter kueri page . Kali ini parameter kueri foo memiliki nilai string "null" , yang agak aneh. Dalam hal ini saya masih ingin memiliki nilai null , sehingga saya dapat dengan mudah memverifikasi bahwa parameter tersebut tidak memiliki nilai.

Kueri: ?page=1 dan bukan ?page=1&foo=null

Akhirnya, ketika saya mengklik tombol ChangeFoo , saya bertransisi lagi, kali ini mengatur nilai parameter kueri foo ke nilai apa pun. Sekarang nilainya bukan null, saya dapat menggunakan nilai ini untuk membuat string kueri saya.

Kueri ?page=1&foo=3

@raytiley Baru saja menulis catatan di https://github.com/raytiley/ember.js/commit/26a3f8569edb58f8644ce4f9cec7000276c327a6#diff -0631ecfe6138cf2c2eb2d94369c3e846R1640.

Jika saya menetapkan qp ke null secara eksplisit, maka qp akan dimasukkan ke string dalam model hook. Ini sepertinya tidak benar, karena null harus mewakili "tidak ada nilai", dan jika seseorang menginginkan string null, mereka dapat membuatnya berdasarkan nilai null .

Jika tidak, jika Anda ingin meneruskan QP yang hanya memiliki nilai, Anda harus melakukan params.myQP && params.myQp !== "null" ..

Saya pikir ini sudah kedaluwarsa tetapi akan dibuka kembali jika seseorang dapat menunjukkan masalah di JSBin yang menggunakan ember.js berikut: http://s3.amazonaws.com/machty/to_s3_uploads/ember-9fbe6c2a-c124-5c2e-0414 -f5ed36c2a1a2.js

_Jika ada yang menemukan ini melalui Google._

Masalah pada dasarnya terpecahkan, tetapi kasus tepi tetap di mana jika parameter kueri tidak disetel pada pengontrol itu akan membuat serial null menjadi 'null' .

var AnimalsController = Ember.Controller.extend({

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

});

export default AnimalsController;

Mengenai kasus penggunaan @HeroicEric , pengontrol tidak akan tahu cara membuat serial secara cerdas berdasarkan nilai yang akan diberikan selama masa pakainya. Ini sepertinya berfungsi di versi terbaru (2.6):

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

Memutar ember: https://ember-twiddle.com/3afa1091106a91ce2c1734ae2998bc3f?openFiles=controllers.application.js%2C&route=%2F%3Fredevelopment%3Dtrue

Sejak kapan QP mengizinkan pengaturan tipe? Atau apakah Anda baru saja mengusulkan API baru?

Tampaknya tidak terdokumentasi. Melihat ke sini , sepertinya itu bisa diganti.

Oh itu bagus!

Terima kasih, @allthesignals , ini sangat membantu untuk solusi Anda.

Bagaimana dengan solusi ini?

{ key: undefined } menjadi ? _ (tidak termasuk) _
{ key: null } hingga ?key
{ key: '' } hingga ?key=
{ key: 'null' } hingga ?key=null

Daftar yang bagus!

Saya akan memilih ini:
{ key: undefined } menjadi [nothing] _ (tidak termasuk) _
{ key: null } menjadi [nothing] _ (tidak termasuk) _
{ key: '' } hingga ?key
{ key: 'null' } hingga ?key=null

dan mungkin juga:

{ key: false } menjadi [nothing] _ (tidak termasuk) _
{ key: true } hingga ?key

Apakah halaman ini membantu?
0 / 5 - 0 peringkat