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
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'
.