2013-02-07 22 views
19

मैं वर्कफ़्लो को समझने के लिए संघर्ष कर रहा हूं जिसका उपयोग निम्नलिखित परिदृश्य में किया जाएगा:त्रुटि स्थिति में एम्बर डेटा मॉडल के साथ आप क्या कर सकते हैं?

उपयोगकर्ता एक मॉडल बनाता है, चलिए इसे उत्पाद कहते हैं। हम उन्हें भरने के लिए एक फॉर्म के साथ प्रस्तुत करते हैं। सत्यापन के अलावा किसी कारण के लिए सहेजने वाली त्रुटियां (टाइमआउट, एक्सेस इनकार इत्यादि ...) एम्बर में, यह मॉडल को एक त्रुटि स्थिति में डाल देता है। यूआई परिप्रेक्ष्य से, मैं बस इतना करना चाहता हूं कि स्क्रीन पर एक संदेश डालें (आसान) और उपयोगकर्ता को फिर से प्रयास करने की अनुमति दें (स्पष्ट रूप से इतना आसान नहीं)।

मैंने इसे कई बार लिखा है कि लेनदेन का पुन: उपयोग नहीं किया गया है। मैं इसके तर्क को समझता हूं। एक नए उत्पाद के मामले में, मैं एक और नया उत्पाद सरल बनाता हूं, मूल उत्पाद (विशेषताओं, रिश्ते) से डेटा में विलय करता हूं और नए उत्पाद के साथ अपने नियंत्रक की सामग्री को प्रतिस्थापित करता हूं। यह कठिन नहीं था और अच्छी तरह से काम करने लगता है, हालांकि (उम्मीद है) एक बेहतर तरीका हो सकता है।

हालांकि, जब मैं एक उत्पाद संपादित कर रहा हूं, तो मैंने एक गंभीर समस्या में भाग लिया है और उपरोक्त समाधान काम नहीं करता है। उत्पाद मॉडल अब त्रुटि स्थिति में है और मुझे इस उत्पाद की एक प्रति प्राप्त करने का कोई तरीका नहीं मिल रहा है जो एक ही स्थिति में नहीं है।

क्या मैं नहीं समझ सकता कि मैं इस मॉडल के साथ त्रुटि स्थिति को हिट करने के बाद क्या कर सकता हूं। मैंने निम्नलिखित कोशिश की है:

रोलबैक: यह काम नहीं करता है। आप त्रुटि स्थिति में लेनदेन को रोलबैक नहीं कर सकते हैं।

पुनः लोड करें: ऊपर जैसा ही है। त्रुटि स्थिति में एक रिकॉर्ड फिर से लोड करने की अनुमति नहीं है।

रिकॉर्ड की एक नई प्रति प्राप्त करें: तो मैं मौजूदा रिकॉर्ड के समान आईडी के साथ App.Product.find (id) आज़माता हूं। यह मुझे त्रुटि स्थिति में, मौजूदा रिकॉर्ड की एक प्रति देता है।

मुझे उम्मीद है कि मैं यहां कुछ मूलभूत याद कर रहा हूं। क्या एक त्रुटि स्थिति (या उस मामले के लिए अमान्य स्थिति) से अच्छी तरह से रिकॉर्ड रोल करना संभव है?

यदि इन मॉडलों की स्थिति को बदलने का कोई आसान तरीका है, तो क्या हमें अभी भी प्रतिबद्ध करने के प्रयासों के लिए एक नया लेनदेन बनाना चाहिए?

+0

इस धागे और इस पैटर्न को देखें। http://stackoverflow.com/a/16471974/1330615 – danielgatis

+0

इस धागे और इस पैटर्न को देखें। http://stackoverflow.com/a/16471974/1330615 – danielgatis

+1

@danielgatis मैं अपने सार है, जो लिंक आप पोस्ट से लिंक किया गया ... मैं देख रहा हूँ क्यों अपने पैटर्न एक के लिए काम करता है पर एक नज़र था नया रिकॉर्ड क्योंकि आप आसानी से असफल हो जाते हैं और एक नया बनाते हैं जब यह मान्य नहीं होता है। क्या इससे आपको उपयोगकर्ता द्वारा दर्ज डेटा खोना नहीं पड़ता है? यह मौजूदा रिकॉर्ड को संपादित करने के लिए भी काम नहीं करेगा। आखिरकार इस प्रश्न पर आपकी टिप्पणी तीन बार पोस्ट करने की आवश्यकता थी? –

उत्तर

13

तो स्रोत और प्रयोग पढ़ने के कुछ दिनों के बाद, मैं इस निष्कर्ष पर आया हूं कि यह कार्यक्षमता अभी तक लागू नहीं हुई है। किसी अन्य राज्य में रिकॉर्ड स्थानांतरित करने के लिए आपको इसे एक ईवेंट भेजना होगा जो इसे statemanager पर पास करता है। ऐसा लगता है कि त्रुटि स्थिति पर कोई घटना पंजीकृत नहीं है जो हमें रिकॉर्ड पुनर्प्राप्त करने की अनुमति देती है।

एक बदसूरत कामकाज है - मैं रिकॉर्ड के statemanager पर transitionTo पर कॉल कर सकता हूं और इसे उस राज्य में मजबूर कर सकता हूं जो हम चाहते हैं। मैंने इसे हल्के ढंग से करने का फैसला नहीं किया, लेकिन इस बिंदु पर मुझे एम्बर-डेटा विकसित होने की प्रतीक्षा करते समय परियोजना के साथ जारी रखना चाहिए। तो अगर रिकॉर्ड अब तक न सहेजा गया है, हम इसे गलत या त्रुटि राज्य से फोन करके बचाव कर सकते हैं:

model.get('stateManager').transitionTo('loaded.created.uncommitted')

या एक मौजूदा रिकार्ड के लिए:

model.get('stateManager').transitionTo('loaded.updated')

इस बार किया गया है कहा जाता है, आप उस लेनदेन पर दोबारा कॉल करने का प्रयास कर सकते हैं जिसमें मॉडल रहता है। यह डिफ़ॉल्ट लेनदेन होगा क्योंकि एम्बर-डेटा का व्यवहार एक मॉडल को मूल लेनदेन में ले जाने के बाद एक मॉडल को डिफ़ॉल्ट लेनदेन में ले जाना है। model.get('transaction')

पर कॉल करके आप हमेशा मौजूदा लेनदेन को पुनर्प्राप्त कर सकते हैं, इसके अंत में, मेरे पास सामान्य सीआरयूडी परिदृश्य बनाने का एक तरीका है जिसे हम रूबी पर रूबी में देख सकते हैं, लेकिन मुझे विश्वास नहीं है ऐसा करने का आदर्श तरीका है। मुझे विश्वास है कि इस समय पर, न ही एम्बर-डेटा टीम करता है।

आप में से उन लोगों के लिए जो एम्बर के लिए नियंत्रक और मार्ग मिश्रक के रूप में सीआरयूडी कार्यक्षमता रखने में रुचि रखते हैं, मेरे पास Gist है जिसमें वर्तमान में उपयोग किए जाने वाले कोड I कैमरे हैं। यह ठीक काम कर रहा है, बचत त्रुटियों के साथ ही सत्यापन त्रुटियों से ठीक हो जाता है। उम्मीद है कि मैं इसे परिष्कृत करना जारी रख सकता हूं क्योंकि एम्बर-डेटा विकसित होता है।

+1

आपके कोड के लिए धन्यवाद। हालांकि, मुझे लगता है कि आपके कोड का उपयोग करते समय मुझे दौड़ की स्थिति होती है; यह 'लाइफसाइक्लैकबैक' ईवेंट भेजने से पहले राज्य को मजबूर करता है और जब ऐसा होता है, तो यह अनचाहे हो जाता है (लोड किया गया राज्य उस घटना को संभाल नहीं करता है)। घटनाओं पर संसाधित नहीं होने पर एम्बर गलती के हाल के संस्करण। – bouke

+0

हाय! इस धागे और इस पैटर्न पर एक नज़र डालें। http://stackoverflow.com/a/16471974/1330615 – danielgatis

0

डेविड,

आप एक Ember.Object कि कायम नहीं है, बल्कि अपने मौजूदा मॉडल के रूप में एक ही गुण है के रूप में मॉडल की एक समानांतर प्रतिनिधित्व बनाने की कोशिश कर सकते। यदि आपका AJAX किसी त्रुटि स्थिति में वापस आ जाता है तो आप कुछ करने के लिए AJAX विधि द्वारा प्रदान की गई त्रुटि कॉलबैक का उपयोग कर सकते हैं।

इस मामले में, रिकॉर्ड को हटाने के लिए "कुछ" हो सकता है, और फिर अपने डमी ऑब्जेक्ट से गुणों को एक नए रिकॉर्ड में क्लोन करें और रिकॉर्ड को फिर से सहेजें। सफलता कॉलबैक पर बस अपनी अस्थायी वस्तु को नष्ट कर दें और यदि सभी रिकॉर्ड साफ़ हैं तो अपने अस्थायी वस्तुओं को साफ़ करें (अस्थायी अस्थायी वस्तुओं को रोकने के लिए)।

यह भी पागल हो सकता है ... लेकिन यह मुझे एक विकल्प के रूप में मारता है।

स्टीव

+1

हाय स्टीव, मैं प्रश्न का उत्तर देने के आपके प्रयास की सराहना करता हूं, दुर्भाग्य से समाधान यथार्थवादी नहीं है। यहां तक ​​कि अगर मैं समांतर वस्तु बनाने की परेशानी पर जाता हूं, तो तथ्य यह है कि एम्बर मॉडल अभी भी इसकी त्रुटि स्थिति में है, मुझे इसे हटाने से रोकता है। तो नई वस्तु को देखते हुए, मैं अभी भी इसे सहेजने या अपडेट करने के लिए एम्बर डेटा का उपयोग नहीं कर सकता। साथ ही, एक साइड नोट के रूप में, मैं एपीआई से चीजों को हटाना नहीं चाहता हूं इसलिए मैं उन्हें फिर से बना सकता हूं। डेटा को संभालने का कोई अच्छा तरीका नहीं है। सादा जेएस और अजाक्स का उपयोग यहां किसी भी समस्या के आसपास काम करेगा। सवाल यह है कि यह एम्बर डेटा के साथ कैसे किया जाना चाहिए। –

2

आप उस पर एक becameValid घटना ट्रिगर कर सकते हैं:

record.send("becameValid"); 

यह अप्रतिबद्ध राज्य के लिए मॉडल प्रारंभ कर देना चाहिए।

+2

यह तब काम नहीं करता जब कोई त्रुटि त्रुटि स्थिति में हो। –

7
1.0.0-beta5 ( https://github.com/emberjs/data/commit/994f3b234ef899b79138ddece60d8b214c5449e3 देखें) आप कॉल करने के लिए सक्षम होना चाहिए में DS.Errors के अलावा के साथ

...

record.get("errors").clear(); 

यह पिछले त्रुटियों को साफ और becameValid से चलाता होगा।

+0

'save()' से पहले इसे कॉल करने से मुझे एक ही रिकॉर्ड को सहेजने की अनुमति मिलती है। धन्यवाद! –