11

Obecnie próbuję umieścić coś razem z ember + emberdata + router + asp.net web api. Wydaje się, że większość z nich działa, ale utknąłem w komunikacie o błędzie, który pojawia się, gdy dane emberowe próbują uzyskać findAll przez adapter dla moich modeli.Ember-Data: Jak działają "mapowania"

W moim backend Mam modelu jak ten (C#):

public class Genre { 
    [Key] 
    public int Id { get; set; } 
    [Required] 
    [StringLength(50, MinimumLength=3)] 
    public string Name { get; set; } 
} 

co w mojej aplikacji, którą reprezentuję, to jak to przy użyciu ember-data:

App.Genre = DS.Model.extend({ 
    id: DS.attr("number"), 
    name: DS.attr("string") 
}).reopenClass({ 
    url: 'api/genre' 
}); 

Mam też sklep zdefiniowane w mojej aplikacji przy użyciu RESTAdapter tak:

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

a sklep jest używany w moim kontroler jak poniżej:

App.GenreController = Ember.ArrayController.extend({ 
    content: App.store.findAll(App.Genre), 
    selectedGenre: null 
}); 

Router jest zdefiniowany jako

App.router = Em.Router.create({ 
    enableLogging: true, 
    location: 'hash', 
    root: Ember.Route.extend({ 
     //... 

     genre: Em.Route.extend({ 
      route: '/genre', 
      index: Ember.Route.extend({ 
       connectOutlets: function (router, context) { 
        router.get('applicationController').connectOutlet('genre'); 
       } 
      }) 
     }), 

     //... 
    }) 
}) 

Kiedy uruchamiam moją aplikację, pojawia się następujący komunikat dla każdego obiektu, który ma tę samą strukturę:

Uncaught Error: assertion failed: Your server returned a hash with the key 0 but you have no mappings

odsyłającym tutaj json usługa wraca:

[ 
    { 
    "id": 1, 
    "name": "Action" 
    }, 
    { 
    "id": 2, 
    "name": "Drama" 
    }, 
    { 
    "id": 3, 
    "name": "Comedy" 
    }, 
    { 
    "id": 4, 
    "name": "Romance" 
    } 
] 

Nie mogę powiedzieć dokładnie, na czym polega problem, a ponieważ twierdzenie jest wspomnieć, że muszę mapowanie, chciałbym wiedzieć:

  1. Co to jest odwzorowanie i jak go używać.
  2. Ponieważ zwrócona json jest tablicą, czy powinienem używać innego typu kontrolera w mojej aplikacji, czy jest coś, o czym powinienem wiedzieć podczas pracy z tego typu jsonem w danych ember? lub czy powinienem zmienić opcje JsonFormatter na serwerze?

Każda pomoc jest mile widziane.

Mogę zdecydowanie dodać więcej informacji, jeśli uważasz, że to nie wystarczy, aby zrozumieć problem.

EDIT: Zmieniłem kilka rzeczy w moim backend i teraz mój findAll() równoważne działanie na serwerze serializuje wyjście jako poniższym json:

{ 
    "genres": [ 
     { "id": 1, "name": "Action" }, 
     { "id": 2, "name": "Drama" }, 
     { "id": 3, "name": "Comedy" }, 
     { "id": 4, "name": "Romance" } 
    ] 
} 

Ale nadal nie mogę dostać to zapełnienie moich modeli w kliencie i mój komunikat o błędzie zmienił się do tego:

Uncaught Error: assertion failed: Your server returned a hash with the key genres but you have no mappings

Nie jestem pewien, co jeszcze robię źle.

Metoda że rzuca ten wyjątek jest sideload i czeki dla odwzorowań takich jak ten:

sideload: function (store, type, json, root) { 
     var sideloadedType, mappings, loaded = {}; 

     loaded[root] = true; 

     for (var prop in json) { 
      if (!json.hasOwnProperty(prop)) { continue; } 
      if (prop === root) { continue; } 

      sideloadedType = type.typeForAssociation(prop); 

      if (!sideloadedType) { 
       mappings = get(this, 'mappings'); 
       Ember.assert("Your server returned a hash with the key " + prop + " but you have no mappings", !!mappings); 
//... 

toll sideloadedType = type.typeForAssociation(prop); powraca undefined I wtedy pojawia się komunikat o błędzie. Metoda sprawdza klucz , zwracając pusty kod.

Nadal nie ma na to rozwiązania w tej chwili.

Przy okazji ...

Moje działanie jest teraz tak:

// GET api/genres 
    public object GetGenres() { 
     return new { genres = context.Genres.AsQueryable() }; 
    } 

    // GET api/genres 
    //[Queryable] 
    //public IQueryable<Genre> GetGenres() 
    //{ 
    // return context.Genres.AsQueryable(); 
    //} 

musiałem usunąć oryginalną realizację których pobiera odcinkach przez json.NET jak nie mogłem znaleźć config opcje do generowania danych json w oczekiwaniu Ember-Data (jak w {resource_name : [json, json,...]}). Efektem ubocznym tego jest to, że straciłem wbudowaną obsługę OData, ale chciałbym ją zachować. Czy ktokolwiek wie, jak mogę go skonfigurować do produkcji różnych jsonów dla kolekcji?

Odpowiedz

12

odwzorowanie może być zdefiniowana w DS.RESTAdapter. Myślę, że możesz spróbować zdefiniować coś takiego:

App.Store = DS.Store.extend({ 
    adapter: DS.RESTAdapter.create({ 
    bulkCommit: true, 
    mappings: { 
     genres: App.Genre 
    }, 
    // you can also define plurals, if there is a unregular plural 
    // usually, RESTAdapter simply add a 's' for plurals. 
    // for example at work we have to define something like this 
    plurals: { 
     business_process: 'business_processes' 
     //else it tries to fetch business_processs 
    } 
    }), 
    revision: 4 
}); 

Mam nadzieję, że rozwiąże to Twój problem.

Aktualizacja:

W tym czasie, to nie jest dobrze udokumentowane, nie pamiętam, jeśli okazało się, że przez Nas odczytaniu kodu, czy może Tom Dale wskazał na niego.
W każdym razie, tutaj jest punkt dla plurals Do mapowania, myślę, że byliśmy napędzani przez ten sam błąd co ty, i albo próbowaliśmy, albo Tom uczył nas o tym.

+0

Obie odpowiedzi pomogły, domyślam się, że naprawdę nie wiedziałem, gdzie ustawić mapowania. Teraz wreszcie zacznę pracę z widokami i szablonami. Dzięki Sylvain – MilkyWayJoe

+0

Ostatnia rzecz, nie mogłem znaleźć żadnych szczegółów na temat "mapowań".Czy możesz wskazać, gdzie mogłem go znaleźć? Jeśli jest to tylko kod źródłowy? Może/powinien być dostępny w pliku readme. – MilkyWayJoe

+0

Nie ma za co :) –

8

RESTAdapter oczekuje zwrócona JSON być w postaci:

{ 
    "genres": [{ 
    "id": 1, 
    "name": "action" 
    },{ 
    "id": 2, 
    "name": "Drama" 
    }] 
} 

Próby dobre źródło informacji patrz https://github.com/emberjs/data/blob/master/packages/ember-data/tests/unit/rest_adapter_test.js#L315-329

+0

udało mi się zrobić mój serwis do produkowania json w tym samym formacie, ale teraz pojawia się komunikat „* Uncaught Error: twierdzenie nie powiodło się: Twój serwer zwrócił hash z kluczowymi gatunkami, ale nie masz mapowań * ". Udało mi się załadować z innym zestawem kontrolerów/modeli z ember 0.9.1 i bez danych ember – MilkyWayJoe

+0

Niestety, to nie jest format json, to jest coś innego teraz jak zwracam format wskazany powyżej i teraz dostaję ten sam komunikat dla innej właściwości, a nie dla indeksu. – MilkyWayJoe

3

Używam Ember Data rev. 11 i wygląda na to, że konfiguracja plurals w DS.RESTAdapter.create nigdy nie działa. Spojrzałem w kodach i znalazł rozwiązanie w następujący sposób:

App.Adapter = DS.RESTAdapter.extend({ 
    bulkCommit: false 
}) 

App.Adapter.configure('plurals', { 
    series: 'series' 
})