ExtJS 4.1.0ExtJS और परिसर सहेजें संचालन
अद्यतन 6/6/13:
मैं Sencha मंचों जहां ज्यादा कार्रवाई नहीं किया गया है पर यह एक ही प्रश्न पोस्ट किया है। पोस्ट उतना ही कम है, लेकिन मुझे लगा कि मैं इसे सिर्फ संदर्भ के लिए जोड़ दूंगा। मैं अभी भी अन्य समुदाय के सदस्यों के इनपुट को सुनने के लिए उत्सुक हूं कि एटीजेएस आवेदन में एक बहुत ही सामान्य परिदृश्य होना चाहिए! http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores
अद्यतन 7/16/13 (निष्कर्ष?)
Sencha पद बहुत कम चर्चा हुई। मैंने अपने आवेदन सर्वर पर जटिल बचत कार्यों के अधिकांश भार को रखने का फैसला किया है और जहां आवश्यक हो वहां क्लाइंट स्टोर को आलसी रीफ्रेश करें। इस तरह मैं परमाणुता की गारंटी के लिए एक जटिल डोमेन ऑब्जेक्ट सेव के सभी लेनदेन को शामिल करने के लिए अपने स्वयं के डेटाबेस रैपर का उपयोग कर सकता हूं। यदि कोई नया Order
सहेजने के क्रम में मेटाडेटा को सहेजना है, OrderContents
के दस नए उदाहरण और संभावित रूप से अन्य जानकारी (अन्य तालिकाओं में रहने वाले पते, ऑर्डर सृजन के समय परिभाषित एक नया ग्राहक इत्यादि) मैं अधिकतर पेलोड भेजूंगा क्लाइंट-साइड एप्लिकेशन कोड में कॉलबैक के एक अश्लील वेब को स्थापित करने के बजाय एप्लिकेशन सर्वर। डेटा जो एक से एक आधार पर जुड़ा हुआ है (जैसे Order
हैऑन Address
) Order.save()
ऑपरेशन के कॉलबैक में अपडेट किया गया है। अधिक जटिल डेटा, जैसे Order
की सामग्री, आसानी से contentStore.sync()
पर कॉल करके आलसी है। मुझे लगता है कि इसका मतलब है ग्राहक-कॉलबैक
मूल पोस्ट सामग्री
संघ भारी मॉडल बचत के समग्र निराशाजनक कार्यक्षमता को देखते हुए की भारी संख्या के बिना atomicity गारंटी करने के लिए है, मैं सभी लेकिन छोड़ दिया है मेरे आवेदन में मॉडल एसोसिएशन और संबंधित डेटा को पुनः प्राप्त करने पर भरोसा करते हैं। यह सब ठीक है और अच्छा है, लेकिन दुर्भाग्य से डेटा को सहेजने और सर्वर पर परिवर्तनों को दर्शाने के लिए ExtJS स्टोर्स को अपडेट करने के मुद्दे को हल नहीं करता है।
उदाहरण के लिए Order
ऑब्जेक्ट को सहेजने के लिए लें, जो मेटाडेटा के साथ-साथ OrderContents
यानी ऑर्डर के हिस्सों से बना है। मेटाडेटा डेटाबेस में तालिका में समाप्त होता है, जबकि सामग्री Order_Contents
तालिका में समाप्त होती है जहां प्रत्येक पंक्ति order_id
कॉलम के माध्यम से मूल क्रम से जुड़ी होती है।
क्लाइंट पर, ऑर्डर के लिए सामग्री पुनर्प्राप्त करना संगठनों की आवश्यकता के बिना करना आसान है: var contents = this.getContentsStore().query('order_id', 10).getRange()
। हालांकि, एक प्रमुख दोष यह है कि यह OrderContents
ExtJS स्टोर में उपलब्ध सामग्री रिकॉर्ड पर निर्भर है, जो लागू होगा यदि मैं "मुख्य" ऑब्जेक्ट के साथ डेटा सर्वर द्वारा वापस नहीं किए गए एसोसिएशन का उपयोग कर रहा था।
ऑर्डर सहेजते समय, मैं एक एकल अनुरोध भेजता हूं जिसमें ऑर्डर का मेटाडाटा (उदा। दिनांक, ऑर्डर नंबर, सप्लायर जानकारी इत्यादि) के साथ-साथ सामग्री की एक सरणी भी होती है। डेटा के इन टुकड़ों को अलग किया जाता है और उनकी उचित तालिकाओं में सहेजा जाता है। यह मेरे लिए पर्याप्त समझ में आता है और अच्छी तरह से काम करता है।
एप्लिकेशन सर्वर से सहेजे गए/अपडेट किए गए रिकॉर्ड लौटने की बात आने तक सभी ठीक है।चूंकि अनुरोध OrderObject.save()
पर कॉल करके निकाल दिया गया है, इसलिए OrderContents
स्टोर को कुछ भी नहीं बता रहा है कि नए रिकॉर्ड उपलब्ध हैं। अगर मैं स्टोर में रिकॉर्ड्स जोड़ना चाहता हूं और .sync()
पर कॉल करता हूं, तो मुझे स्वचालित रूप से संभाला जाएगा, लेकिन मुझे लगता है कि यह बचत प्रक्रिया को जटिल करता है और मैं बस इतना नहीं कहूंगा कि एप्लिकेशन सर्वर पर इस डिकूप्लिंग को पूरा नहीं करना है, एक पूरा अनुरोध सहेजना काफी है अच्छा भी है।
क्या इसे हल करने का कोई बेहतर तरीका है? मेरे वर्तमान समाधान इस प्रकार है ...
var orderContentsStore = this.getOrderContentsStore();
MyOrderObject.save({
success: function(rec, op){
// New Content Records need to be added to the contents store!
orderContentsStore.add(rec.get('contents')); // Array of OrderContent Records
orderContentsStore.commitChanges(); // This is very important
}
});
commitChanges()
रिकॉर्ड की दुकान करने के लिए जोड़ा बुला करके स्वच्छ (गैर प्रेत, गैर गंदा) माना जाता है और इस तरह नहीं रह गया है स्टोर की getModifiedRecords()
विधि द्वारा लौटाए गए ; ठीक है, इसलिए store.sync()
की स्थिति में रिकॉर्ड्स को एप्लिकेशन सर्वर पर पास नहीं किया जाना चाहिए।
यह दृष्टिकोण सिर्फ थोड़े लापरवाह/मेरे लिए hacky लगता है, लेकिन मैं एक बेहतर समाधान पता लगा नहीं है ...
किसी भी इनपुट/विचार बहुत सराहना कर रहे हैं!
दुर्भाग्यवश यह करने का एकमात्र तरीका है। वैकल्पिक रूप से, आप स्टोर के प्रॉक्सी पर अपना "लेखक" लिख सकते हैं और वहां विभिन्न मॉडलों को संभाल सकते हैं लेकिन यह भी गन्दा होगा। – Mike
मेरी मान्यताओं की पुष्टि करने के लिए धन्यवाद, @ माइक। मैं कुछ दिन एक ब्लॉग पोस्ट लिखने जा रहा हूं और मैं इस प्रश्न का उत्तर उस पोस्ट से जानकारी के साथ दूंगा। मैंने डेटा राइटर के लिए कुछ पागल विस्तार को लागू करने पर विचार किया था, लेकिन यह क्या होगा (एक स्टोर.लोड() को यहां और वहां सहेजने के लिए) मुझे लगता है कि लागू जटिलता और समय लागू करने के लिए आवश्यक समय मेरे लायक नहीं होगा। –