2012-06-15 12 views
15

मैं कुछ समय से इस के साथ संघर्ष कर रहा हूं; चलो देखते हैं कि कोई मेरी मदद कर सकता है या नहीं।एम्बर-डेटा सत्यापन के लिए मानक पैटर्न क्या है? (अमान्य स्थिति, बन गया अविश्वसनीय ...)

हालांकि इसे रीडेमे में स्पष्ट रूप से नहीं कहा गया है, एम्बर-डेटा कुछ हद तक सत्यापन प्रदान करता है। आप देख सकते हैं कोड के कुछ भागों और प्रलेखन पर कि:

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L411

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L529

बाकी एडाप्टर सत्यापन पर ही समर्थन नहीं जोड़ता है, लेकिन मुझे पता चला है कि अगर मैं कुछ इस तरह जोड़ने

error: function(xhr){ 
    var data = Ember.$.parseJSON(xhr.responseText); 
    store.recordWasInvalid(record, data.errors); 
} 

तो मैं आसानी से निम्नलिखित कर सकते हैं: ajax कॉल में, मैं त्रुटियों वस्तु के साथ एक "अवैध" राज्य है कि सर्वर साइड से आया है पर मॉडल रख सकते हैं

012,
var transaction = App.store.transaction(); 
var record = transaction.createRecord(App.Post); 
record.set('someProperty', 'invalid value'); 
transaction.commit() 
// This makes the validation fail 

record.set('someProperty', 'a valid value'); 
transaction.commit(); 
// This doesn't trigger the commit again. 

बात है: जैसा कि आप देख, लेनदेन recommit की कोशिश न करें। यह here और here समझाया गया है।

तो बात यह है कि: यदि मैं किसी प्रतिबद्धता का पुन: उपयोग नहीं कर सकता, तो मुझे इसे कैसे संभालना चाहिए? मुझे थोड़े संदेह है कि इस तथ्य के साथ कुछ करने के लिए मैं अजीब तरीके से मॉडल को invalid स्थिति में डाल रहा हूं - reading the documentation द्वारा, ऐसा लगता है कि क्लाइंट-साइड सत्यापन के लिए कुछ ऐसा है। इस मामले में, मुझे उनका उपयोग कैसे करना चाहिए?

उत्तर

1

यह एक बहुत ही सरल उत्तर प्रतीत हो सकता है, लेकिन क्यों नया लेनदेन नहीं बनाते और इसे पूर्व-मौजूदा रिकॉर्ड जोड़ते हैं? मैं एक त्रुटि हैंडलिंग दृष्टिकोण को समझने की भी कोशिश कर रहा हूं।

आपको भी पुनः उपयोग के लिए एडाप्टर स्तर की बजाय स्टोर स्तर पर इसे लिखना चाहिए।

+1

नहीं इस समस्याग्रस्त हो सकता है? –

1

कुछ अज्ञात कारणों से, रिकॉर्ड स्टोर डिफ़ॉल्ट लेनदेन का हिस्सा बन जाता है। इस कोड को मेरे लिए काम करता है:

var transaction = App.store.transaction(); 
var record = transaction.createRecord(App.Post); 
record.set('someProperty', 'invalid value'); 
transaction.commit() 

record.set('someProperty', 'a valid value'); 
App.store.commit(); // The record is created in backend 

समस्या यह है कि पहले की विफलता के बाद, आप हमेशा App.store.commit() समस्याओं यह है के साथ उपयोग करना चाहिए है।

+0

मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि यह डिफ़ॉल्ट लेनदेन के रूप में तब तक जुड़ा हुआ है जब तक कि आप विशेष रूप से किसी संदर्भ को परिभाषित नहीं करते हैं। – Marco

+0

क्या आपके पास इसका कोई उदाहरण है? –

2

मैंने जेवियर के जवाब की कोशिश की, लेकिन मुझे अमान्य स्थिति में रिकॉर्ड के साथ record.set(...) करने पर "अमान्य पथ" मिलता है। क्या मैंने पाया काम किया था:

// with the record in invalid state 
record.send('becameValid'); 
record.set('someProperty', 'a valid value'); 
App.store.commit(); 

वैकल्पिक रूप से, ऐसा लगता है कि अगर मैं record.get(...) पहले तो उसके बाद वाले record.set(...) कॉल फोन काम करते हैं। यह शायद एक बग है। लेकिन उपर्युक्त काम-आसपास सामान्य रूप से किसी भी संपत्ति को बदलने के बिना भी एक ही रिकॉर्ड को पुनः सक्षम करने में सक्षम होने के लिए काम करेगा। (बेशक, अगर गुण अभी भी अमान्य हैं यह सिर्फ फिर से असफल हो जायेगी।)

+0

मैंने 'record.send ('बन गया') जोड़ा है; 'मेरे मॉडल में' बनने योग्य 'फ़ंक्शन। यह मेरी समस्या के आसपास काम किया। यह सिरिल से गिटहब पुल अनुरोध पर एक टिप्पणी से प्रेरित है। – ybart

0

इस सार पर एक नज़र दे दिया है। इसका पैटर्न जो मैं अपनी परियोजनाओं में उपयोग करता हूं।जब से तुम लेनदेन के लिए गंदा वस्तुओं को नहीं जोड़ सकते

https://gist.github.com/danielgatis/5550982