2013-05-14 8 views
10

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 लगता है, लेकिन मैं एक बेहतर समाधान पता लगा नहीं है ...

किसी भी इनपुट/विचार बहुत सराहना कर रहे हैं!

+1

दुर्भाग्यवश यह करने का एकमात्र तरीका है। वैकल्पिक रूप से, आप स्टोर के प्रॉक्सी पर अपना "लेखक" लिख सकते हैं और वहां विभिन्न मॉडलों को संभाल सकते हैं लेकिन यह भी गन्दा होगा। – Mike

+0

मेरी मान्यताओं की पुष्टि करने के लिए धन्यवाद, @ माइक। मैं कुछ दिन एक ब्लॉग पोस्ट लिखने जा रहा हूं और मैं इस प्रश्न का उत्तर उस पोस्ट से जानकारी के साथ दूंगा। मैंने डेटा राइटर के लिए कुछ पागल विस्तार को लागू करने पर विचार किया था, लेकिन यह क्या होगा (एक स्टोर.लोड() को यहां और वहां सहेजने के लिए) मुझे लगता है कि लागू जटिलता और समय लागू करने के लिए आवश्यक समय मेरे लायक नहीं होगा। –

उत्तर

3

अद्यतन 8/26/13 मैंने पाया कि संबद्ध डेटा वास्तव में मॉडल के प्रॉक्सी पर/अद्यतन बनाने कॉलबैक में Ext द्वारा नियंत्रित किया जाता है, लेकिन उस डेटा खोजना आसान नहीं था ... यहाँ मेरी पोस्ट देखें: ExtJS 4.1 - Returning Associated Data in Model.Save() Response

ठीक है, यह प्रश्न खुला होने के कुछ महीने हो गए हैं और मुझे लगता है कि इस समस्या के लिए कोई जादूई भयानक समाधान नहीं है।

मेरे समाधान इस प्रकार है ...

जब एक जटिल मॉडल (जैसे, एक मॉडल है कि होगा, या कुछ hasMany संघों है) की बचत, मैं 'माता-पिता' मॉडल जो सभी संबंधित डेटा शामिल बचाने (मॉडल पर एक संपत्ति/क्षेत्र के रूप में!) और उसके बाद बाद में सहेजे गए/सहेजे गए कॉलबैक में सहेजे गए (सहेजे गए) डेटा को जोड़ें। उदाहरण के लिए

लें मेरी PurchaseOrder मॉडल है जो hasManyItems और hasOneAddress। ध्यान दें कि संबंधित डेटा मॉडल के गुणों में शामिल है, क्योंकि यह सर्वर के पास नहीं भेजा जाएगा यदि यह मॉडल के एसोसिएशन स्टोर में पूरी तरह से मौजूद है।

console.log(PurchaseOrder.getData()); 
--- 
id: 0 
order_num: "PO12345" 
order_total: 100.95 
customer_id: 1 
order_address: Object 
    id: 0 
    ship_address_1: "123 Awesome Street" 
    ship_address_2: "Suite B" 
    ship_city: "Gnarlyville" 
    ship_state: "Vermont" 
    ship_zip: "05401" 
    ...etc... 
contents: Array[2] 
    0: Object 
     id: 0 
     sku: "BR10831" 
     name: "Super Cool Shiny Thing" 
     quantity: 5 
     sold_price: 84.23 
    1: Object 
     id: 0 
     sku: "BR10311" 
     name: "Moderately Fun Paddle Ball" 
     quantity: 1 
     sold_price: 1.39 

मैं ModelsPurchaseOrder.Content और PurchaseOrder.Address के लिए की स्थापना की है, फिर भी PurchaseOrder में डेटा इन मॉडलों, बल्कि सिर्फ डेटा का एक उदाहरण नहीं है। दोबारा, यह सुनिश्चित करना है कि यह एप्लिकेशन सर्वर के लिए सही ढंग से पारित हो गया है।

एक बार मैं एक वस्तु के ऊपर वर्णित की तरह, मैं इसे बंद अपने आवेदन सर्वर से .save() के माध्यम से भेज इस प्रकार है:

PurchaseOrder.save({ 
    scope: me, 
    success: me.afterOrderSave, 
    failure: function(rec,op){ 
     console.error('Error saving Purchase Order', op); 
    } 
}); 

afterOrderSave: function(record, operation){ 
    var me = this; 
    switch(operation.action){ 
     case 'create': 
      /** 
       * Add the records to the appropriate stores. 
       * Since these records (from the server) have an id, 
       * they will not be marked as dirty nor as phantoms 
       */ 
      var savedRecord = operation.getResultSet().records[0]; // has associated! 
      me.getOrderStore().add(savedRecord); 
      me.getOrderContentStore().add(savedRecord.getContents()); //association! 
      me.getOrderAddressStore().add(savedRecord.getAddress()); // association! 
      break; 

     case 'update': 
      // Locate and update records with response from server 
      break; 
    } 
} 

मेरे आवेदन सर्वर PurchaseOrder प्राप्त करता है और उसके अनुसार डेटा बचत संभालती है। मैं सकल विवरण में नहीं जाऊंगा क्योंकि यह प्रक्रिया काफी हद तक आपके कार्यान्वयन पर निर्भर है। मेरा आवेदन ढांचा ज़ेन 1.11 (मुख्य रूप से लीवरेजिंग Zend_Db) पर आधारित है।

मुझे लगता है यह निम्नलिखित कारणों के लिए सबसे अच्छा तरीका है:

  • विभिन्न मॉडल का कोई गंदा स्ट्रिंग।ग्राहक पर
  • केवल एक अनुरोध है, जो प्रबंधन करने के लिए
  • Atomicity आसानी से आवेदन सर्वर पर नियंत्रित किया जाता है बहुत आसान है को बचाने() कॉलबैक
  • कम दौर यात्राएं = विफलता की कम क्षमता अंक में चिंता करने की के बारे में
  • हैं आप वास्तव में आलसी महसूस कर रहे हैं, success कॉलबैक की विधि बस reload स्टोर कर सकती है।

मैं इस उत्तर को चर्चा को प्रोत्साहित करने के लिए थोड़ा सा बैठूंगा।

पढ़ने के लिए धन्यवाद!

+0

मुझे लगता है कि यह शायद जाने के सबसे साफ तरीकों में से एक है। +1 – Mike

+0

@ माइक फॉलो अप के लिए धन्यवाद, इसकी सराहना करें! –