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ć:
- Co to jest odwzorowanie i jak go używać.
- 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?
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
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
Nie ma za co :) –