Untuk dapat mengetahui apakah koleksi itu diisi, atau sedang diisi, mungkin ada sesuatu seperti
collection.fetch();
collection.isFetching()===true; // display loading
(collection.isFetching()===false; && collection.length) // display no records found
Kasus penggunaan nyata (penyederhanaan, objek dilewatkan jauh di dalam sistem):
javascript()
// somewhere in the code
collection = new MyCollection();
// somewhere else in the code
view = new MyView({collection:collection});
// and somewhere else in the code
collection.fetch();
tampilan mendengarkan sinyal koleksi, dan menampilkan memuat/tidak ada catatan/daftar catatan
untuk model, mungkin ada yang menyimpan/menghapus/memperbarui hal
Hai @g00fy-! Saya akan merekomendasikan Anda menggunakan acara "request"
dan "sync"
untuk tujuan ini. Bagaimana menurutmu?
collection.on('request', function() {
// loading...
}).on('sync', function() {
// display records or "none found"
});
collection.fetch();
_Edit - maksud saya acara "request"
, bukan "fetch"
._
Saya pikir itu ide yang bagus @braddunbar!
Terima kasih @caseywebdev! :)
Beri tahu kami jika itu tidak berhasil untuk Anda @g00fy-.
@braddunbar , @caseywebdev idenya adalah untuk memisahkan kedua bagian itu. (tampilan harus bisa mendapatkan koleksi dalam keadaan apa pun, bukan hanya koleksi _'bersih'_)
Saya sadar bahwa saya dapat melakukan ini dengan menggunakan sinyal, tetapi dalam banyak kasus ini tidak dapat dilakukan dengan cara ini. Urutan tindakan itu penting
Saya setuju bahwa tampilan harus mendengarkan sinyal 'permintaan' dan 'sinkronisasi', tetapi sinyal permintaan mungkin dikirim sebelum koleksi diteruskan ke tampilan , oleh karena itu tampilan tidak tahu bahwa koleksi sedang diambil.
Pertimbangkan sebuah contoh, di mana tampilan Anda mendapatkan koleksi arbitrer. Koleksi ini dapat berupa _fetched_ , _fetching_ atau _unfetched_ ketika diteruskan ke tampilan (tl:dr lihat contoh 3) .
collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent
collection = new Backbone.Collection();
collection.fetch(); // now sync signal gets sent
// after fetch completes
// view won't be able to receive 'sync' signal
view = new Backbone.View({collection:collection});
view.render();
// at this point collection.length == 0.
// I guess the view can listen to 'sync' and then render 'empty'
collection = new Backbone.Collection();
collection.fetch(); // now 'request' signal gets sent, but it is pending
// view won't be able to receive 'request' signal
view = new Backbone.View({collection:collection}); // at this point collection.length == 0
// view did not receive the 'request' signal, therefore has no idea that the collection is fetching
// and the view should render 'loading'
// after 2 seconds, 'sync' signal gets sent
Tampilan tidak boleh berasumsi bahwa jika collection.length == 0 maka itu tidak diambil.
Tampilan juga tidak boleh berasumsi bahwa itu diberikan koleksi dalam keadaan tidak diambil (atau dalam keadaan lain).
Jika kita ingin memisahkan collection dari view, maka view harus bisa mengetahui apa itu collection state.
hal yang sama berlaku untuk Model
@g00fy Jika Anda tidak bisa hanya fetch
koleksi setelah mengirimnya ke tampilan, atur tanda fetching
atau semacamnya pada koleksi Anda.
collection.on({
request: function () { this.fetching = true; },
'sync error': function () { this.fetching = false; }
});
Sekarang tampilan Anda dapat mengakses this.collection.fetching
dan juga menunggu this.collection
untuk menjalankan acara sync
atau error
.
@caseywebdev
Permintaan mungkin dibatalkan, atau dua permintaan mungkin dikirim sekaligus.
// example 1
collection.fetch().abort() // and collection.fetching == true
// example 2 - don't care about abort();
collection.fetch();
collection.fetch();
// 1st request compleated
!!collection.fetching == false // but the 2nd request is pending - should it be loading or not?
// 2nd request completed
Solusi untuk ini adalah menghubungkan do deferred xhr
collection.on({
'request':function(model,xhr){
this.fetching = true;
xhr.fail(function(){this.fetching = false }.bind(this));
},
'sync error': function () { this.fetching = false; }
});
Itu sebabnya, saya pikir ini mungkin berguna untuk memiliki ini, tetapi di sisi lain, jika setiap peningkatan seperti ini berhasil, basis kode BB akan membengkak.
jika setiap peningkatan seperti ini berhasil, basis kode BB akan membengkak.
Saya pikir ini bukan tentang kembung daripada tentang pendekatan. Ada banyak cara berbeda yang mungkin Anda inginkan untuk menangani permintaan bersamaan. Backbone memberi Anda primitif yang Anda butuhkan untuk menanganinya dan kemudian menyingkir.
@ g00fy- Anda mungkin ingin melihat penulisan mesin keadaan terbatas untuk tujuan Anda. Chaplin.js memiliki satu yang seharusnya cukup mudah untuk ditiru, dan ada juga ifandelse/machina.js (lihat posting blog ) yang mungkin sesuai dengan kasus penggunaan spesifik Anda.
Komentar yang paling membantu
@braddunbar , @caseywebdev idenya adalah untuk memisahkan kedua bagian itu. (tampilan harus bisa mendapatkan koleksi dalam keadaan apa pun, bukan hanya koleksi _'bersih'_)
Saya sadar bahwa saya dapat melakukan ini dengan menggunakan sinyal, tetapi dalam banyak kasus ini tidak dapat dilakukan dengan cara ini. Urutan tindakan itu penting
Saya setuju bahwa tampilan harus mendengarkan sinyal 'permintaan' dan 'sinkronisasi', tetapi sinyal permintaan mungkin dikirim sebelum koleksi diteruskan ke tampilan , oleh karena itu tampilan tidak tahu bahwa koleksi sedang diambil.
Pertimbangkan sebuah contoh, di mana tampilan Anda mendapatkan koleksi arbitrer. Koleksi ini dapat berupa _fetched_ , _fetching_ atau _unfetched_ ketika diteruskan ke tampilan (tl:dr lihat contoh 3) .
Contoh 1 (di mana sinyal akan bekerja)
Contoh 2 (tampilan sudah diambil, tetapi koleksi kosong, sinyal juga akan berfungsi)
Contoh 3 (paling penting, sinyal tidak akan berfungsi)
Tampilan tidak boleh berasumsi bahwa jika collection.length == 0 maka itu tidak diambil.
Tampilan juga tidak boleh berasumsi bahwa itu diberikan koleksi dalam keadaan tidak diambil (atau dalam keadaan lain).
Jika kita ingin memisahkan collection dari view, maka view harus bisa mengetahui apa itu collection state.
hal yang sama berlaku untuk Model