2013-01-05 15 views
6

Użyłem commit eaa1123 (ember) i 508479d (ember-data) do zbudowania plików JS.Nie można uzyskać wielu skojarzeń

Mam następujący JSON zwrócony z mojego Rails backend, który jest generowany z active_model_serializers (0.6.0):

{ 
    "posts": [ 
    { 
     "id": 408, 
     "title": "Lorem Ipsum", 
     "body": "In at quo tempora provident nemo.", 
     "comments": [ 
     { 
      "id": 956, 
      "body": "Quo incidunt eum dolorem." 
     }, 
     ... 
     ] 
    } 
    ] 
} 

oraz następujące modele Ember:

App.Post = DS.Model.extend({ 
    title: DS.attr('string'), 
    body: DS.attr('string'), 
    comments: DS.hasMany('App.Comment', { 
    embedded: true 
    }) 
}); 

App.Comment = DS.Model.extend({ 
    body: DS.attr('string'), 
    post: DS.belongsTo('App.Post') 
}); 

wszystkie wyglądają zupełnie normalnie :

post = App.Post.find(408); 
post.get('title') 
// => "Lorem Ipsum" 

Jednak nie mogę przejść do komentarzy:

comments = post.get('comments') 
comments.get('firstObject') instanceof App.Comment 
// => true 
comments.forEach(function(comment) { 
    console.log(comment.get('body')) 
}) 
//=> undefined 

Gdy używam:

comments.content 

mam tablicę, która zawiera obiekty, więc:

comments.content[0] 
//=> { body: "Quo incidunt eum dolorem.", id: 956 } 

ale to nie jest to, czego się spodziewałem.

Wydaje się to tak oczywiste, więc muszę zrobić coś złego. Jako efekt uboczny: obecnie nie jestem w stanie renderować moich komentarzy w szablonie w łatwy sposób, więc mam nadzieję, że ktoś może mi pomóc w tym.

Z góry dziękuję.

Odpowiedz

10

Jeśli użyto że popełnić to znaczy, że są na najnowszej wersji Ember transmisji danych, która jest 11. Dodanie wbudowany: True ładowania wbudowanego stowarzyszenie została zaniechana jakiś czas temu między rewizji 5 lub 9, nie zbyt pewny jeszcze raz.

Jeśli używasz domyślnego restAdapter, teraz trzeba definiować osadzonej załadunek jako mapowanie, jak pokazano poniżej, a nie jako opcja asocjacji:

App.store = DS.Store.create({ 
    revision: 11, 
    adapter: DS.RESTAdapter.create() 
}); 

App.store.adapter.serializer.map('App.Post', { 
    comments: {embedded: 'load'} 
}); 

App.Post = DS.Model.extend({ 
    title: DS.attr('string'), 
    body: DS.attr('string'), 
    comments: DS.hasMany('App.Comment') 
}); 

App.Comment = DS.Model.extend({ 
    body: DS.attr('string'), 
    post: DS.belongsTo('App.Post') 
}); 

można śledzić całą poprzednią dyskusję na nim poprzez linki poniżej:

https://github.com/emberjs/data/issues/504#issuecomment-11256934 https://github.com/emberjs/data/pull/430#issuecomment-10925506

Różne poprawki do ładowania wbudowanego zapisów: https://github.com/emberjs/data/pull/541

To nie jest bezpośrednio związane, ale okrywać wszystko co napisałem powyżej zawiedzie, a następnie dodać ten roztwór do związku belongsTo mix nie zmaterializował przy użyciu findAssociation i extractHasMany haki na asynchronicznym hasMany: https://github.com/emberjs/data/issues/525

The funkcje wewnętrzne dla każdego, kto chce szybko sprawdzić, gdzie określone są rzeczy związane z wywołaniem "App.store.adapter.serializer.map"

Kiedy nazwaliśmy "App.store.adapter.ser ializer.mapa”, wezwanie do serializatora definiuje on line 536 poniżej, a mapa jest online 696 w 2 linku

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/adapter.js#L536 https://github.com/emberjs/data/blob/master/packages/ember-data /lib/system/adapter.js#L696

w linii 67 DS.RESTAdapter która rozciąga DS.Adapter, właściwość serializer składa się wskazywać na DS.RESTSerializer gdzie dodatkowa funkcjonalność specyficzne dla RestAdapter zostały dodane.

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L67

+0

Wielkie dzięki, to na pewno pomogło. Zgaduję, że gdzieś zagubiłem ślad zmian;) – bazzel

Powiązane problemy