2012-10-31 19 views
6

İLK vs: Ben bu soruyu burada istendi gerçekleştirmek: in ExtJS, is it better to call Model.save() or Store.Sync()? - Ben özellikle XHR en aza indirerek ilişkin daha bu incelemek isteyen ancak ve Hem istemcide hem de sunucuda gereksiz ek yük. Bu noktalardan herhangi birinin bağlantılı soruda ele alındığını hissetmiyorum.ExtJS 4.1 - Store.add() (senkronizasyon ardından) Model.save()

Bir çok modelden, görünümden ve denetleyiciden oluşan, kurumsal kaynak yönetimi için tasarlanmış büyük bir uygulama sahibim. Tüm yanıtları sunucumdan Ext.Ajax requestComplete ve requestException olayları için bir dinleyici oluşturarak hallediyorum. Her modelin proxy afterRequest olayında yinelenen olay işleyicileri yazmak yerine bu yaklaşımı aldım. Bu, tüm arka uçlarımın (Zend Framework'ü kullanarak) üç parametre ile yanıt verebilmemi sağlar: success, message ve data.

Başarılı bir istekten sonra (yani, HTTP 200), requestComplete için çalıştırılan yöntem, daha önce bahsedilen parametreler için JSON yanıtını denetler. success, false ise, message içinde bulunan ve daha sonra kullanıcıya görüntülenen bir hata iletisi olması beklenir (ör. 'Bu ürünü kaydetmeyle ilgili bir sorun oluştu. Geçersiz ürün adı'). Başarı doğruysa, isteğin türüne, yani Oluştur, Oku, Güncelle veya Yok Et'e bağlı olarak eylem yapılır. Başarılı bir create'dan sonra, kayıt silindikten sonra, yeni kayıt uygun veri deposuna eklenir ve benzerleri.

Bir mağazaya kayıt eklemek ve XHR'leri en aza indirgemek ve aksi halde gidiş dönüşleri önlemek için mağazanın sync yöntemini çağırmak yerine bu yaklaşımı kullanmayı seçtim. Mevcut veri kaydetme/güncelleme aracı, isteği arka uça göndermek ve Ext ön uçtaki sonuca tepki vermek. Bunu, verileri içeren bir modeli doldurarak ve create/update istekleri için model.save() yöntemini veya verileri kaldırmak için model.destroy() öğesini çağırarak yapıyorum.

Bir mağazadan kayıt eklerken/güncellerken/kaldırırken, sonra store.sync() öğesini çağırırken, sunucunun yanıtını garip hissettiğim bir şekilde yanıtlamak zorunda kalacağım. Ben false mağazanın autoSync kümesine sahip olarak Invoke store.sync(),

  1. İlk store.remove()
  2. yoluyla deposundan kaydını kaldırın: Bir kayıt silme gibi atın.
  3. Bu, AJAX imha isteğini mağazanın model proxy'sinden başlatır.
  4. Burada garip oluyor .... sunucuda satır silinirken sunucuda bir hata varsa, yanıt success: false döndürecektir, ancak kayıt zaten ExtJS Veri Deposundan kaldırılmış olacaktır.
  5. Bu noktada store.sync(), store.load() (her ikisi de bir gidiş dönüş gerektirir) arayabilir veya kayıttan isteğinizi alabilir ve ek bir eşitleme/yükleme çağrısı yapmaktan kaçınmak için bir commitChanges() takiben mağazaya ekleyebilir ve böylece önleyebilirsiniz gereksiz bir gidiş geliş.

aynı sunucu veritabanına veri eklerken, kayıt ExtJS deposunda hala ve store.sync() veya store.load() ile bir gidiş-dönüş önlemek için elle kaldırılması gerekir yerde başarısız olursa, kayıtları ekleme için de geçerli.

Önceden açıkladığım gibi, tüm bu sorunu önlemek için, model nesnelerimden birini örnekliyorum (ör.bir Ürün modeli), veriyle doldurun ve myModel.save()'u arayın. Bu da, proxy'nin model kimliğine bağlı olarak create veya update'u çağırır ve uygun AJAX isteğini tetikler. Arka uç başarısız olursa, ön uç deposu hala değişmez. Başarılı istekler üzerine (read: success: true, HTTP 200 değil), el ile kayıt depoya eklemek ve store.commitChanges(true) çağırmak, etkili bir şekilde ek bir tur gezisi olmadan ve gereksiz ek yük kaçınarak veritabanı ile mağaza senkronize. Tüm istekler için, sunucu yeni/değiştirilmiş veriler ile birlikte bir başarı parametresi ve koşullu olarak istemcide görüntülenecek bir mesajla yanıt verecektir.

Burada bir şey eksik mi, yoksa bu yaklaşım XHR'leri ve sunucu/istemci yükünü en aza indirmenin iyi bir yolu mu? İstenilen örnek kodu vermekten memnuniyet duyuyorum, ancak bunun temel kodla oldukça genel bir kavram olduğunu hissediyorum.

+1

[1] buldum bu [link] bir göz atın çok yararlı [1]: http://stackoverflow.com/questions/11022616/store-do-something-after- autosync etkin – Amin

+0

@Amin ile senkronize et, bunlar kesinlikle yardımcı yöntemler! Uygulamanın çoğu bölümü için model.save() yapıyorum, ancak yerleşik mağaza senkronizasyonu kullanıldığında bu çok yararlı olacaktır. Teşekkür ederim! –

cevap

2

Sanırım sizin konumunuzu açık bir şekilde savundunuz. Aldığın pozisyonda yanlış bir şey göremiyorum. Tek amacım, düzenlenebilir ızgarayı destekleyen bir mağazadaki autoSync ayarının, daha az kontrolle de olsa, görevi gerçekleştirmenin çok daha az ayrıntılı bir yolu olduğuna işaret etmektir.

Eklemek için, işaret ettiğin tepenin genel olarak beklenmedik olması veya özel işlem veya fazladan bir veri yenilemesi gerektiren durumlarda arayabileceğimi bildiririm. Bu özel durumlar için dinleyicileri ekleyebilir ve geri kalanları terse varsayılanlarıyla bırakabilirsiniz.

+0

Girişiniz için teşekkür ederiz. Senkronizasyondan kaynaklanan gerçek paket boyutuna ve genel ağ trafiğine fazla bakmadığımı itiraf edeceğim. Bir olayı ateşleyerek oddball işlemlerini yürütme konusundaki yaklaşımınızı seviyorum - bu yaklaşımla uğraşmak ve nasıl hissettiğini görmek zorunda kalacağım. Anlayışlı yorum için +1, –

+0

senkronizasyon ve kaydetme arasında herhangi bir fark olmamalıdır çünkü ikisi de sunucuyla konuşmak için aynı (potansiyel olarak) proxy kullanıyorlar. – dbrin