Backbone: Koleksi dan Model mengambil/menyimpan status dll

Dibuat pada 24 Jan 2013  ·  9Komentar  ·  Sumber: jashkenas/backbone

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

question

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)

collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent

Contoh 2 (tampilan sudah diambil, tetapi koleksi kosong, sinyal juga akan berfungsi)

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' 

Contoh 3 (paling penting, sinyal tidak akan berfungsi)

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

Semua 9 komentar

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

Contoh 1 (di mana sinyal akan bekerja)

collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent

Contoh 2 (tampilan sudah diambil, tetapi koleksi kosong, sinyal juga akan berfungsi)

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' 

Contoh 3 (paling penting, sinyal tidak akan berfungsi)

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

alundiak picture alundiak  ·  7Komentar

rafde picture rafde  ·  9Komentar

omenking picture omenking  ·  10Komentar

jonathan picture jonathan  ·  11Komentar

jashkenas picture jashkenas  ·  7Komentar