2015-09-14 14 views
6

Jestem nowy w Ember i staram się stworzyć łatwą aplikację, w której mam 2 modele, góry i zakresy. Pasmo ma wiele gór, a góra należy do zasięgu. Chcę utworzyć relację między nimi. Przeszukałem internet, ale znalazłem inne wyjaśnienia i wciąż mam problem z tym problemem.Relacje z Ember CLI Mirage

Moje modele:

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}) 
}); 

Mój plik mirage/scenario/default.js wygląda następująco:

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 }); 
} 

i są one mirage/factories/range.js i mirage/factories/mountain.js pliki:

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

export default Mirage.Factory.extend({ 

}); 

Czy to właściwa droga do ustanowienia relacji z Mirage Ember-CLI? Chciałbym również pokazać na stronie himalaya (już utworzyłem trasę i szablon) wszystkie góry, które należą do zakresu himalaya. Jak mogę to osiągnąć?

Z góry dziękuję.

Odpowiedz

7

Obecnie musisz ręcznie rejestrować relacje, więc tak, idziesz właściwą drogą. Zauważ, że może chcesz zaktualizować zakresy z identyfikatorami górskich:

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]}); 

Ale Sam Selikoff ciężko pracuje na Mirage i wkrótce będzie można zrobić coś takiego:

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' }); 

I Chciałbym również pokazać na stronie himalaya (już stworzyłem trasę i szablon) wszystkie góry, które należą do zakresu himalai. Jak mogę to osiągnąć?

Prosta rozwiązaniem jest utworzenie następujących trasach Mirage:

  • mountains/:id
  • ranges/:id

Jeśli Twoje relacje są synchroniczne, w trasie Ember range musisz poprosić o zasięg, uzyskać powiązane identyfikatory gór i poprosić o nie.

Jeśli twoje relacje są asynchroniczne, musisz poprosić o zasięg. Ember/ED automatycznie zażąda brakujących powiązanych rekordów, gdy będą dostępne z szablonu. Ale spowoduje to błysk brakujących danych na stronie.

Bardziej eleganckim rozwiązaniem jest sideloading. Potrzebujesz tylko trasy Mirage ranges/:id. Gdy zasięg jest wymagany przez tę trasę, masz do dyspozycji góry Mirage serve (sideload) oprócz żądanego zakresu.

Weź również pod uwagę strukturę JSON, której używasz. Jeśli używasz adaptera/serializera oldschool, interfejs API jest trochę arbitralny i wszystko w porządku. Jeśli używasz nowego adaptera JSONAPI, musisz zastosować specyfikację JSONAPI. Aby mieć pewność, że pewne dane są sideloaded, musisz explicitly ask for it.

Serializacja JSONAPI nie jest jeszcze dostępna w Mirage po wyjęciu z pudełka. Ostatecznie będziesz mógł używać skrótów, ale obecnie musisz mieć do manually format the data format JSONAPI.

+0

Nie zapomnij o przegłosowaniu.^_^ –

+0

Łatwe ładowanie może być wykonane za pomocą adaptera JSONAPI, np. 'return this.store.findAll ('community', {include: 'organizer'});' – knownasilya

Powiązane problemy