2013-11-27 7 views
16

कैसे आप संबंधित डेटा के लिए अनुरोध पृष्ठ पर अंक लगाना है पृष्ठ पर अंक लगाना के लिए? उदाहरण के लिए, अगर मेरे व्यक्ति एक हजार टास्क मॉडल इसे से जुड़ी है, तो मैं निम्नलिखित, RESTful सोच में, मैं उन सभी को मिलेगा है।कैसे एंबर-डेटा रिश्तों

var tasks = person.get('tasks'); 

यह बहुत अधिक डेटा होगा। दृश्यों के पीछे काम करने वाले अनुरोध पर मैं कुछ क्वेरी पैरामीटर को कैसे बल दूं? आदर्श रूप से इस तरह के अंत से जुड़े कुछ के साथ एक अंतराल के लिए।

?&offset=3&limit=3

यहाँ एक fiddle क्या मैं IndexController में पूरा करने के लिए कोशिश कर रहा हूँ वर्णन करने के लिए है। मुझे नहीं पता कि "एम्बर रास्ता" एम्बर-डेटा का उपयोग करके पेजिनेटेड अनुरोधों को क्या करना है।

+2

क्या आपने कभी इसका अच्छा समाधान निकाला है? जवाब देने के लिए – RyanJM

उत्तर

-2

Ember.js guides on using models से, आप find() कॉल के साथ एक प्रश्न भी सबमिट कर सकते हैं।

this.store.find('person', { name: "Peter" }).then(function(people) { 
    console.log("Found " + people.get('length') + " people named Peter."); 
}); 

गाइड से:

खोज विकल्प है कि आप find() को पारित एंबर डाटा में अपारदर्शी है के हैश। डिफ़ॉल्ट रूप से, ये विकल्प आपके सर्वर पर HTTP GET अनुरोध के रूप में भेजे जाएंगे।

इस सुविधा का उपयोग करने के लिए आवश्यक है कि आपका सर्वर क्वेरी प्रतिक्रियाओं को कैसे समझें।

+0

धन्यवाद। हाँ, मैंने इसे पढ़ लिया है। समस्या यह है कि मेरे रिलेशनशिप एंडपॉइंट्स मेरे पेलोड के 'लिंक' हिस्से में निहित हैं। अगर मैं सभी 'कार्य' चाहता हूं, तो मैं उपर्युक्त विधि का उपयोग करूंगा लेकिन यदि मैं किसी विशिष्ट व्यक्ति के कार्यों के लिए पूछना चाहता हूं, तो मेरा एंडपॉइंट अलग है, 'लोग/$ आईडी/कार्य' – David

+0

उस प्रकार की संरचना के साथ ऐसा लगता है 'व्यक्ति' के पास 'कार्य' होना चाहिए: बहुत अधिक ('कार्य') 'रिश्ते है, तो आप' person.get ('functions') 'का उपयोग करके किसी विशिष्ट व्यक्ति के कार्यों तक पहुंच पाएंगे? – CraigTeegarden

+0

मैं कोशिश कर सकता हूं लेकिन मेरे ऐप में कार्य पॉलिमॉर्फिक हैं। वे लोगों या कंपनियों से संबंधित हो सकते हैं। – David

10

यह अस्तित्व में नहीं था जब यह सवाल पहले कहा गया था, लेकिन अब कोई एडऑन ember-data-has-many-query कहा जाता है कि, इस में सक्षम रहा है कम से कम RESTAdapter और JSONAPIAdapter के लिए है। ऐसा लगता है कि एम्बर-डेटा के कारण कुछ क्विर्क हैं जो अभी तक प्रथम श्रेणी की अवधारणा के रूप में पेजिंग को समर्थन नहीं दे रहे हैं। यह आप असहज बनाता है, वहाँ हमेशा store.query है, लेकिन इस (आपके उदाहरण में) का समर्थन करने के /tasks अंत बिंदु पर एक person_id फिल्टर पैरामीटर अपने एपीआई की आवश्यकता है।

संबंधित:

  • ember-data issue #3700: समर्थन क्वेरी पैरामीटर जब hasMany रिश्ते को लाते समय
  • json-api issue #509: पृष्ठांकन के से-अनेक रिश्तों underspecified है

(यह इस सवाल शामिल की तरह नहीं दिखता JSON एपीआई, लेकिन चर्चा प्रासंगिक है)

5

आज के रूप में वहाँ अब भी है कोई एम्बर में पेजिनेशन को संभालने के लिए डिफ़ॉल्ट तरीका।

पहले हम शायद, अधिक सरल बात पर गौर करना चाहिए एक findAll अनुरोध के पृष्ठांकन।

यह .query({page:3}) की तरह कुछ के साथ किया जा सकता है लेकिन सुराग कुछ समस्याएं हैं:

  1. इस क्लासिक पृष्ठांकन के लिए एक अच्छा समाधान है, लेकिन के लिए एक अनंत-स्क्रॉल आप फिर भी मैन्युअल परिणाम मर्ज करने के लिए की जरूरत है।
  2. परिणाम कैश नहीं किए गए हैं, इसलिए एक पेजिनेटेड सूची पर आगे और पिछड़े आगे बढ़ने के परिणामस्वरूप बहुत सी क्वेरीएं होती हैं। कभी-कभी यह आवश्यक है यदि सूची संपादन योग्य है, लेकिन अक्सर इसकी नहीं।

दूसरी समस्या के लिए मैं एक छोटे से addon called ember-query-cache कि दुकान में हुक और आप क्वेरी परिणाम कैश करने के लिए अनुमति देता है निर्माण। एक बहुत छोटा डेमो here उपलब्ध है।

अब अगर हम एक रिश्ता मैं ईमानदारी से जब तक आप एंबर-डेटा से ही बेहतर समर्थन शीर्ष स्तर .query उपयोग करने के लिए सिफारिश करेंगे के बारे में बात:

store.query('task', { person: get(person, 'id'), page: 3 } 

इसके बारे में बुरा कुछ भी नहीं है। आप अपना परिणाम प्राप्त करते हैं और दूसरे दिशा में संबंध रखते हैं। जब तक आपको कैशिंग की आवश्यकता नहीं होती है, तब तक यह एम्बर-डेटा में किसी भी हैकिंग के बिना काम करता है, और यदि आपको कैशिंग की आवश्यकता है तो मुझे अपने एडन में बहुत कम हैकिंग की आवश्यकता है।

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

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