2015-09-02 4 views
8
Ember  : 1.13.3 
Ember Data : 1.13.5 
jQuery  : 1.11.3 

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

मैं JSONAPI (http://jsonapi.org/format/#document-compound-documents) का उपयोग करना चाहता था क्योंकि यह एम्बर में डिफ़ॉल्ट एडाप्टर बन रहा है। इसके अलावा, कुछ सी # पुस्तकालय हैं जो इस प्रारूप को संभालते हैं, इसलिए मैंने सोचा कि यह काफी सरल होगा। हालांकि, spec पढ़ने के बाद, ऐसा लगता है कि अगर वे एक आईडी नहीं है तो मैं वस्तुओं को एम्बेड नहीं कर सकता। एम्बरजेएस भी जेएसओएन को बच्चे ऑब्जेक्ट्स को संलग्न नहीं करता है, भले ही मैंने DS.attr पर { async: false, embedded: 'always' }) निर्दिष्ट किया हो।

मेरा प्रश्न है: यदि किसी एप्लिकेशन का उपयोग इस तरह से किया जाता है कि क्लाइंट साइड पर ऑब्जेक्ट ग्राफ़ बनाया गया है, तो आप पूरे ऑब्जेक्ट ग्राफ़ को सर्वर पर भेजने के लिए JSONAPI प्रारूप का उपयोग कैसे करते हैं? क्या मुझे JSONAPI मानक को संतुष्ट करने के लिए क्लाइंट पक्ष पर आईडी उत्पन्न करना है? फिर सर्वर पर पहुंचने के बाद बस उन्हें अनदेखा करें ताकि वे ओआरएम द्वारा उत्पन्न आईडी के साथ सहेजे जाए?

import DS from 'ember-data'; 

export default DS.Model.extend(DS.EmbeddedRecordsMixin, { 
    name: DS.attr('string'), 
    labelGroups: DS.hasMany('labelGroup', { async: false, embedded: 'always'}) 

}); 

यहाँ पोस्ट है कि मैं एक() को बचाने परियोजना पर करने के बाद मिलता है:

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    labels: DS.hasMany('label-model', { async: false, embedded: 'always' }) 
}); 

यहाँ मेरी परियोजना मॉडल है:

यहाँ मेरी labelGroup मॉडल है

{ 
    "data":{ 
    "attributes":{"name":"Project"}, 
    "relationships":{ 
     "label-groups":{ 
     "data":[ 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null}, 
     {"type":"label-groups","id":null} 
     ] 
    } 
    }, 
    "type":"label-projects" 
    } 
} 

अद्यतन: मैंने क्लाइंट साइड आईडी उत्पन्न करने के लिए https://www.npmjs.com/package/ember-cli-uuid का उपयोग करने का प्रयास किया। हालांकि आउटपुट प्राप्त करने वाले डेटा में अतिरिक्त ऑब्जेक्ट्स शामिल नहीं होते हैं, केवल उनके आईडी के संदर्भ में। मुझे यहां निर्दिष्ट "शामिल" संपत्ति देखने की उम्मीद है: http://jsonapi.org/format/#document-compound-documents, लेकिन यह वहां नहीं है।

{ 
    "data":{ 
    "id":"7b4544ee-91cd-493d-8b10-52040e68c283", 
    "attributes":{"name":"Project"}, 
    "relationships":{ 
    "label-groups":{ 
     "data":[ 
     {"type":"label-groups","id":"08115273-e82a-4d46-93ea-232ce071fb78"}, 
     {"type":"label-groups","id":"9ca94fe9-8077-411e-98d2-1694c6fecce4"}, 
     {"type":"label-groups","id":"d629f1e8-7962-404d-8034-38229ab21f77"}, 
     {"type":"label-groups","id":"c6bda655-5489-4760-847b-bf02239bb2c5"}, 
     {"type":"label-groups","id":"f6fef249-2d1d-43f0-ba64-24b7ff8b5637"}, 
     {"type":"label-groups","id":"a7db25bf-52c8-477b-83e4-64e7c76b072e"}, 
     {"type":"label-groups","id":"f3b5fbb3-261a-4b3d-b481-b9352f8ce2d6"} 
     ] 
    } 
    }, 
    "type":"label-projects" 
    } 
} 
+0

मैंने थोड़ा सा शोध किया, और पाया कि जेएसओएनएपीआई के पास अभी तक पोस्ट या पैच अनुरोधों के लिए "एम्बेडेड" या "शामिल" रिकॉर्ड्स के लिए अंतिम समाधान नहीं है। https://github.com/lytics/ember-data-model-fragments addon उस कार्यक्षमता को प्रदान करने का प्रयास प्रतीत होता है। मैं इसे आज़माउंगा। – Grapho

उत्तर

3

एम्बर-डेटा इस समय आप जो चाहते हैं उसके लिए कोई समर्थन नहीं है। तो एम्बर-डेटा आपके रिश्ते डेटा को एक सेव पेलोड में सहेज नहीं पाएगा।

लेकिन कस्टम एडाप्टर और सीरिएलाइज़र का उपयोग करके इसे स्वयं करना संभव है। मैं आपको API चेकआउट करने के लिए दृढ़ता से अनुशंसा करता हूं और फिर स्रोत में देखता हूं।

यदि आप अपने मॉडल पर createRecord विधि को createRecord विधि पर कॉल करते हैं तो .save() पर कॉल करें। धारावाहिक पर serializeIntoHash मॉडल को क्रमबद्ध करने के लिए कहा जाता है।

serializeIntoHashserialize पर कॉल करें, जहां serializeBelongsTo और serializeHasMany कहा जाता है।

अब तुम सिर्फ serializeHasMany ओवरराइड और लाइन से पहले hasMany संशोधित कर सकते हैं:

json[payloadKey] = hasMany; 

यहाँ आप प्रकार और आईडी है के रूप में वे एंबर-डेटा द्वारा भेजा जाता है। आप बस .forEach पर कई डेटा प्राप्त कर सकते हैं और फिर डेटा के लिए स्टोर ला सकते हैं और अपना included सरणी बना सकते हैं।

मुझे उम्मीद है कि यह आपको सीरिएलाइज़र और एडाप्टर को समझने में मदद करता है ताकि आप जो कुछ भी करना चाहते हैं उसे करने के लिए इसे संशोधित कर सकें। दरअसल यह एम्बर डेटा के बारे में सबसे अच्छा हिस्सा है। एडाप्टर और सीरिएलाइज़र की संरचना, जो आसान संशोधनों की अनुमति देती है।

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