2013-03-22 17 views
8

मेरे मार्ग में मैं एक विधि है कि सर्वर से मॉडल की एक सूची का अनुरोध करने केमार्ग में एम्बर डेटा के 404 को कैसे संभालें?

model: -> 
    App.MyModel.find 
     projectId: (@modelFor "project").id 

अब स्पष्ट रूप से कभी-कभी यह 404.

पल जब ऐसा होता है पर वापस कर सकती है की कोशिश करता है है, एंबर बस बंद हो जाता है कुछ भी करना। कोई दृश्य प्रस्तुत नहीं किया गया है, कोई नियंत्रक सेटअप नहीं है।

तो मैं 404 (यानी एक त्रुटि दृश्य दिखाएं) को कैसे ठीक से संभाल सकता हूं?

उत्तर

3

खराब समाचार: अभी, एम्बर-डेटा कुछ भी नहीं करता है जब यह 404 पर मिलता है()। बिलकुल। मॉडल हमेशा के लिए 'लोडिंग' स्थिति में बैठता है।

मेरी राय में, यहां कोई गैर-पूरी तरह से बेवकूफ विकल्प नहीं हैं। मैं आखिरी उपाय के रूप में शायद क्या करूँगा, मेरे डीएस.मोडेल पर notFound विशेषता जोड़ें, और 404 लौटने की बजाय, notFound के साथ जेएसओएन को true पर सेट करें। यह दर्दनाक है, मुझे पता है ...

--- मैंने मूल रूप से RESTAdapter के उप-वर्ग में find ओवरराइड करने का समाधान दिया था। तब मैंने देखा कि find रिकॉर्ड रिकॉर्ड को पारित नहीं किया गया है जो इसे माना जाता है। इसलिए, रिकॉर्ड को एक त्रुटि स्थिति में डालकर 404 को संभालने पर कोई कदम नहीं है।

[नोट: एंबर-डेटा मार्च 2013 के बाद से नाटकीय रूप से बदल गया है, इस जवाब में दी गई जानकारी अब ऑपरेटिव हो सकता है]

+0

यह बेकार है। मेरा मतलब है कि मुझे पता था कि एम्बर-डेटा बढ़ रहा था लेकिन यह पागल है। लेकिन आपके उत्तर के लिए धन्यवाद! – stephanos

+0

क्या आपको लगता है [बेसिक एडाप्टर की घोषणा] (http://emberjs.com/blog/2013/03/22/stabilizing-ember-data.html) यह आसान हो सकता है? – stephanos

+0

यह [मुद्दा] देखें (https://github.com/emberjs/data/issues/296) – pjlammertyn

0

संयोग से, "नया" BasicAdapter अभी जारी किया गया था। मेरे लिए सवाल यह था कि क्या इससे 404 त्रुटियों को संभालने में चीजें आसान हो जाएंगी।

कार्य # 1

मेरा पहला दृष्टिकोण - क्या क्रिस्टोफर सुझाव दे रहा था इसी तरह - HTTP स्थिति युक्त एक अतिरिक्त क्षेत्र को जोड़ने के लिए किया गया था।

$.getJSON(url, data).then(null, function(xhr) { 
    return { 
    id: id, 
    statusCode: xhr.status 
    }; 
}).always(function(data) { 
    return process(data).load(); 
}); 

क्या करता है एक हैश का अनुरोध आईडी और स्थिति कोड युक्त करने के लिए त्रुटि प्रतिक्रिया (XHR) को बदलने के लिए है:

status: DS.attr("number"); 

और फिर मैं इस AJAX कॉल का इस्तेमाल किया। अंत में, सफल परिणाम या असफल हैश स्टोर में पास हो जाते हैं।

इस तरह के काम, लेकिन यह बहुत व्यावहारिक नहीं है: जब आप सभी मॉडल उदाहरणों की एक सूची दिखाते हैं तो उन "नकली" उदाहरणों को मैन्युअल रूप से फ़िल्टर करना होगा।


कार्य # 2

एक और विचार एक विशेष त्रुटि मॉडल बनाने के लिए किया गया था।

App.Error = App.Model.extend({ 
    status: DS.attr("number") 
}); 

और अनुसार क्वेरी:

$.getJSON(url, data).then(null, function(xhr) { 
    return App.store.load(App.Error, {}, { 
    id: 0, 
    status: xhr.status 
    }); 
}).done(function(data) { 
    return process(data).load(); 
}); 

यह लोड और त्रुटि मॉडल का एक नया उदाहरण बना सकते हैं और यह दुकान में डाल देंगे।

इस समस्या के साथ यह है कि एम्बर वास्तव में इसे "स्वीकार नहीं कर रहा था"। एप्लिकेशन ने अभी कुछ भी नहीं कर रहा है, अब कुछ भी नहीं कर रहा है। तो यह बंद रास्ते की तरह के रूप में अच्छी लगती है :(

+0

बस अभी के लिए jQuery.ajax() और Ember.Object() के साथ जाएं ... – fpauser

0

मैं भी आज इस मुद्दे को टक्कर मार दी।

हालांकि, स्रोत देखने के बाद, ऐसा लगता है मॉडल वास्तव में Ember.Evented उपयोग करने के लिए सेटअप है, और हम । इन मामलों के लिए अपने स्वयं के संचालकों में जोड़ सकते हैं

दो घटनाओं है कि मेरी नजर पड़ी becameError और didLoad थे

मेरे मामले में मैं निम्नलिखित की तरह कुछ करने के लिए कर रहा था:।

// Grab a user by id. 
var user_rec = App.User.find(user.id); 

// Oh no! Error! 
user_rec.on('becameError', function() { 
    alert('I could not find you!'); 
}); 

// We should be good! Proceed! 
user_rec.on('didLoad', function() { 
    alert('Your email: '+this.get('email')); 
}); 

यहां गीथब पर स्रोत है: https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/model.js

उम्मीद है कि अगर वास्तव में हमें चीजों को संभालना चाहिए, तो निकट भविष्य में मार्गदर्शिकाओं में कुछ अतिरिक्त दस्तावेज होंगे।

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