İ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()
,
- İlk
store.remove()
- yoluyla deposundan kaydını kaldırın: Bir kayıt silme gibi atın.
- Bu, AJAX imha isteğini mağazanın model proxy'sinden başlatır.
- 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. - 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 bircommitChanges()
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] buldum bu [link] bir göz atın çok yararlı [1]: http://stackoverflow.com/questions/11022616/store-do-something-after- autosync etkin – Amin
@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! –