2013-10-24 12 views
6

क्या मॉडल सहेजते समय कस्टम त्रुटि को संभालने का कोई उचित तरीका है? उदाहरण देने के लिए, मान लें कि मेरे पास केवल दो गुण "नाम" और "मान" वाला मॉडल है। और जब मैं करता हूँ: इससे बचने के लिएमॉडल को सहेजते समय एम्बर-डेटा में कस्टम सर्वर साइड त्रुटियों को संभालने में

var myModel = this.get('store').createRecord('myModel', {"name": "someName", "value": "someValue"}); 
myModel.save().then(function() { 
    //if success 
    //server responded with {"myModel:{"id":1,"name":"someName","value":"someValue"}"} 
},function() { 
    //if failure 
    //server responded with {"error":"some custom error message"} 
    //BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE 

}); 

एक तरह से जाँच करने के लिए अतिरिक्त ajax कॉल करने के लिए करता है, तो नाम अद्वितीय है और फिर सहेज सकता है। मैं बस सोच रहा हूं कि यहां सबसे अच्छा/सुरुचिपूर्ण दृष्टिकोण क्या है।

धन्यवाद, डी

संपादित करें: मैंने सोचा कि यह ग्रूवी में चीजों के सर्वर साइड पर अधिक संदर्भ प्रदान करने के लिए थोड़ा मदद कर सकता है। तो यहाँ यह है:

मेरी नियंत्रक में मेरे पास है:

def create() { 

    try { 
     newRow = someService.create(params) 
     render someService.list(newRow) as JSON//returns data in format needed by ember-data 
    } 
    catch (ValidationException ex) { 
     def errors = ["errors":[]] 

     ex.errors.allErrors.each{ 
      if(it.arguments[0] == "fieldName" && it.code=="constrantViolated"){ 
       errors.errors.push(["field":it.arguments[0],"message":"some custom message"]) 
      } 
     } 
     //I am using 422 here because of post in http://stackoverflow.com/questions/7996569/can-we-create-custom-http-status-codes 
     render(status: 422, contentType: 'JSON', text: (errors as JSON)) 
    } 

} 
मेरी एंबर नियंत्रक में

तब:

var myModel = self.get('store').createRecord('myModel ', myModelDataInJSON); 
myModel .save().then(function() { 
     //if success 
       }, 
    function (response) { 
     myModel .deleteRecord(); 
     var errors = $.parseJSON(response.responseText); 
     for (var key in errors.errors) { 
      //do something 
     } 
    }); 

उत्तर

7

deleteRecord रिकॉर्ड को नष्ट करेगा।

myModel.save().then(function(response) { 
    //if success 
    //server responded with {"myModel:{"id":1,"name":"someName","value":"someValue"}"} 
},function(response) { 
    //if failure 
    //server responded with {"error":"some custom error message"} 
    //BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE 
    if(response.error=='no good'){ 
    myModel.deleteRecord(); 
    } 

}); 
+0

धन्यवाद। मुझे शुरुआत में प्रतिक्रिया प्राप्त करने के साथ समस्या हो रही थी। आतंक लेकिन बाद में मुझे पता चला कि उचित HTTP त्रुटि कोड के साथ प्रतिक्रिया पाठ कैसे भेजना है और इसके बजाय प्रतिक्रिया टेक्स्ट प्राप्त करें। –

+2

इस तरह मैं इस पल के लिए भी करता हूं लेकिन मुझे यह पसंद नहीं है कि यह रिकॉर्ड दिखाएगा और सर्वर के जवाब देने के बाद इसे हटा देगा। क्या सर्वर के उत्तर को लगातार रिकॉर्ड प्रदर्शित करने का इंतजार करने का कोई तरीका है? – Bachet

2

आप अपने मॉडल में गुण जोड़कर मॉडल पर त्रुटियों को संभाल कर सकते हैं:

becameError: -> 
    # handle error case here 
    alert 'there was an error!' 

becameInvalid: (errors) -> 
    # record was invalid 
    alert "Record was invalid because: #{errors}" 

की जांच: DS.ERRORS वर्ग: How should errors be handled when using the Ember.js Data RESTAdapter?

0

क्यों जवाब सिर्फ उपयोग करने के लिए नहीं होगा ?

EmberJS डॉक्स से:

उदाहरण के लिए, आप एक उपयोगकर्ता मॉडल है कि इस तरह देखा था:

App.User = DS.Model.extend({ username: attr('string'), email: attr('string') });

और तुम एक रिकार्ड है कि बैकएंड पर मान्य नहीं था बचाने का प्रयास किया।

var user = store.createRecord('user', { 
    username: 'tomster', 
    email: 'invalidEmail' 
}); 
user.save(); 

आपकी बैकएंड डेटा स्टोर इस तरह की प्रतिक्रिया को वापस कर सकती है। यह प्रतिक्रिया त्रुटि ऑब्जेक्ट को पॉप्युलेट करने के लिए उपयोग की जाएगी।

{ 
    "errors": { 
    "username": ["This username is already taken!"], 
    "email": ["Doesn't look like a valid email."] 
    } 
} 

त्रुटियाँ उनकी संपत्ति नाम तक पहुँचने या संदेशों संपत्ति का उपयोग कर सभी त्रुटियों की एक सरणी प्राप्त करने से उपयोगकर्ता के लिए प्रदर्शित किया जा सकता है।

{{#each errors.messages}} 
    <div class="error"> 
    {{message}} 
    </div> 
{{/each}} 

क्या यह प्रश्न केवल मॉडल में सत्यापन पर केंद्रित है? बनाम दृढ़ता/इसे सहेजना, इसलिए डाटा स्टोर को हिट करने से पहले डेटा साफ़ हो गया है ... ऐसा लगता है कि आप अभी भी एडाप्टर डेटा स्टोर स्तर पर त्रुटि प्रबंधन चाहते हैं।

सभी ने कहा, आप यूआई नियंत्रण स्तर पर टेम्पलेट या सामान्य आधारित जेएस सत्यापन का उपयोग क्यों नहीं करेंगे?

+0

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

+0

मैं देखता हूं ... आपके सर्वर की तरफ आर्किटेक्चर क्या है? क्या यह एक एसक्यूएल प्रकार आधारित डेटाबेस के साथ रेल पर्यावरण पर रूबी है जो आखिरकार सभी डेटा संग्रहीत किया जा रहा है? या कुछ आसान - आराम -> फायरबेस? – DavidK

+0

यहां बताया गया है कि उपरोक्त पाठ संदर्भ के लिए आया है http://emberjs.com/api/data/classes/DS.Errors.html – artburkart

संबंधित मुद्दे