2015-09-14 14 views
6

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

मेरे मॉडल हैं:

mountain.js

import DS from 'ember-data'; 
export default DS.Model.extend({ 
    name: DS.attr('string'), 
    altitude: DS.attr('number'), 
    range: DS.belongsTo('range', {async: true}) 
}); 

range.js

import DS from 'ember-data'; 
export default DS.Model.extend({ 
    name: DS.attr('string'), 
    length: DS.attr('number'), 
    mountains: DS.hasMany('mountain', {async: true}) 
}); 

मेरे mirage/scenario/default.js फ़ाइल इस तरह दिखता है:

export default function(server) 
{ 
    var himalaya = server.create('range', {id: 1, name:'Himalaya', length:'16598' }); 
    var karakorum = server.create('range', {id: 2, name:'Karakorum', length:'34801' }); 

    var everest = server.create('mountain', {id:1, name: 'Everest', altitude: '8871', range_id:1 }); 
    var K2 = server.create('mountain', {id:2, name: 'K2', altitude: '8657', range_id:2 }); 
} 

और इन mirage/factories/range.js कर रहे हैं और mirage/factories/mountain.js फ़ाइलें:

import Mirage, {faker} from 'ember-cli-mirage'; 

export default Mirage.Factory.extend({ 

}); 

इस एंबर-CLI में मृगतृष्णा के साथ एक रिश्ता स्थापित करने के लिए सही तरीका है? मैं हिमालय पृष्ठ (मैं पहले से ही एक मार्ग और एक टेम्पलेट बनाया है) में हिलालय के सभी पहाड़ों से दिखाना चाहता हूं। इसे कैसे प्राप्त किया जा सकता है?

अग्रिम धन्यवाद।

उत्तर

7

वर्तमान में, आपको रिश्ते की बहीखाता मैन्युअल रूप से करना है, इसलिए हाँ, आप सही तरीके से जा रहे हैं। ध्यान दें कि आप पहाड़ आईडी के साथ पर्वतमाला अपडेट करना चाहें:

var himalaya = server.create('range', {id: 1, name:'Himalaya', length:'16598' }); 
var karakorum = server.create('range', {id: 2, name:'Karakorum', length:'34801' }); 

var everest = server.create('mountain', {id:1, name: 'Everest', altitude: '8871', range_id:1 }); 
var k2 = server.create('mountain', {id:2, name: 'K2', altitude: '8657', range_id:2 }); 

server.db.ranges.update(himalaya.id, {mountain_ids: [everest.id]}); 
server.db.ranges.update(karakorum.id, {mountain_ids: [k2.id]}); 

लेकिन सैम Selikoff मिराज पर कड़ी मेहनत कर रहा है और जल्द ही यह कुछ इस तरह करना संभव हो जाएगा:

var everest = server.create('mountain', {id:1, name: 'Everest', altitude: '8871' }); 
var k2 = server.create('mountain', {id:2, name: 'K2', altitude: '8657' }); 

var himalaya = everest.create('range', {id: 1, name:'Himalaya', length:'16598' }); 
var karakorum = k2.create('range', {id: 2, name:'Karakorum', length:'34801' }); 

मैं डी हिमालय पृष्ठ में दिखाना पसंद है (मैंने पहले ही एक मार्ग और एक टेम्पलेट बनाया है) हिमालय श्रेणी के सभी पहाड़। इसे कैसे प्राप्त किया जा सकता है?

सीधा समाधान निम्नलिखित मिराज रूट बनाने के लिए है:

  • mountains/:id
  • ranges/:id

अपने रिश्तों तुल्यकालिक हैं, तो अपने एंबर range मार्ग में आप करना होगा एक सीमा का अनुरोध करें, इसके संबंधित पहाड़ आईडी प्राप्त करें और उनसे अनुरोध करें।

यदि आपके रिश्ते एसिंक हैं, तो आपको केवल सीमा का अनुरोध करना होगा। एम्बर/ईडी स्वचालित रूप से अनुपलब्ध संबंधित रिकॉर्ड्स का अनुरोध करेगा जब उन्हें टेम्पलेट से एक्सेस किया जाएगा। लेकिन इससे पेज पर लापता डेटा का फ्लैश होगा।

एक और सुरुचिपूर्ण समाधान sideloading है। आपको केवल ranges/:id मिराज मार्ग की आवश्यकता है। जब उस मार्ग के माध्यम से एक श्रेणी का अनुरोध किया जाता है, तो आपके पास अनुरोधित सीमा के अतिरिक्त मिराज सेवा (sideload) संबंधित पहाड़ है।

जो भी आप उपयोग कर रहे हैं JSON संरचना को ध्यान में रखें। यदि आप पुरानेस्कूल एडाप्टर/सीरिएलाइज़र का उपयोग कर रहे हैं, तो एपीआई थोड़े मनमानी है और आप ठीक हैं। यदि आप नए JSONAPI एडाप्टर का उपयोग कर रहे हैं, तो आपको JSONAPI spec का अनुपालन करने की आवश्यकता है। कुछ डेटा sideloaded करने के लिए, आपको explicitly ask for it की आवश्यकता है।

JSONAPI क्रमबद्धता अभी तक बॉक्स के बाहर मिराज में उपलब्ध नहीं है। आखिरकार आप शॉर्टैंड्स का उपयोग करने में सक्षम होंगे, लेकिन वर्तमान में आपको JSONAPI प्रारूप में manually format the data करना होगा।

+0

वोट दें करने के लिए मत भूलना।^_^ –

+0

इसके अलावा sideloading JSONAPI एडाप्टर के साथ आसानी से किया जा सकता है, उदा। 'this.store.findAll ('समुदाय', {शामिल करें: 'आयोजक'});' – knownasilya

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