Ich versuche gerade etwas mit ember + emberdata + router + asp.net web api zusammen zu stellen. Die meisten davon scheinen zu funktionieren, aber ich steckte in eine Fehlermeldung, die ich bekomme, wenn Glut-Daten versuchen, findAll
über den Adapter für meine Modelle.Ember-Data: Wie funktionieren "Mappings"
In meinem Backend habe ich ein Modell wie dieses (C#):
public class Genre {
[Key]
public int Id { get; set; }
[Required]
[StringLength(50, MinimumLength=3)]
public string Name { get; set; }
}
, die in meiner app ich es wie diese mit glut-Daten darstellen:
App.Genre = DS.Model.extend({
id: DS.attr("number"),
name: DS.attr("string")
}).reopenClass({
url: 'api/genre'
});
Ich habe auch einen Shop definiert in meiner App der RESTAdapter wie so verwenden:
App.store = DS.Store.create({
revision: 4,
adapter: DS.RESTAdapter.create({
bulkCommit: false
})
});
Und ist der Laden in meinem Controller wie unten verwendet:
App.GenreController = Ember.ArrayController.extend({
content: App.store.findAll(App.Genre),
selectedGenre: null
});
ist der Router als
definiertApp.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');
}
})
}),
//...
})
})
Wenn ich meine Anwendung ausführen, ich die folgende Meldung für jedes Objekt erhalten, die dieselbe Struktur hat:
Uncaught Error: assertion failed: Your server returned a hash with the key 0 but you have no mappings
Als Referenz ist hier Der JSON, den der Dienst zurückgibt:
[
{
"id": 1,
"name": "Action"
},
{
"id": 2,
"name": "Drama"
},
{
"id": 3,
"name": "Comedy"
},
{
"id": 4,
"name": "Romance"
}
]
Ich kann nicht genau sagen, was das Problem ist, und da die Behauptung ist zu erwähnen, dass ich Mapping benötigen, würde ich gerne wissen:
- Was diese Abbildung ist und wie es zu benutzen.
- Da der zurückgegebene JSON ein Array ist, sollte ich einen anderen Typ von Controller in meiner App verwenden, oder sollte ich etwas darüber wissen, wenn ich mit diesem Typ von Json in Glutdaten arbeite? oder sollte ich die JsonFormatter Optionen auf dem Server ändern?
Jede Hilfe ist willkommen.
Ich kann definitiv weitere Informationen hinzufügen, wenn Sie glauben, dass dies nicht genug ist, um das Problem zu verstehen.
EDIT: Ich habe ein paar Dinge in meinem Backend geändert und meine jetzt findAll()
gleichwertige Aktion im Server serialisiert die die Ausgabe wie die folgenden json:
{
"genres": [
{ "id": 1, "name": "Action" },
{ "id": 2, "name": "Drama" },
{ "id": 3, "name": "Comedy" },
{ "id": 4, "name": "Romance" }
]
}
Aber ich kann immer noch nicht es meine Modelle in dem Client und meine Fehlermeldung dies hat zu bevölkern geändert:
Uncaught Error: assertion failed: Your server returned a hash with the key genres but you have no mappings
nicht sicher, was sonst könnte ich falsch machen.
Die Methode, die diese Ausnahme wirft, ist sideload
und prüft, ob die Zuordnungen wie folgt aus:
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);
//...
Dieser Aufruf sideloadedType = type.typeForAssociation(prop);
kehrt undefined
und dann erhalte ich die Fehlermeldung. Die Methode typeForAssociation()
prüft auf den für 'associationsByName'
Schlüssel, der eine leere Ember.Map
zurückgibt.
Noch keine Lösung für diesen Moment.
By the way ...
Meine Aktion ist dies nun wie:
// GET api/genres
public object GetGenres() {
return new { genres = context.Genres.AsQueryable() };
}
// GET api/genres
//[Queryable]
//public IQueryable<Genre> GetGenres()
//{
// return context.Genres.AsQueryable();
//}
ich die ursprüngliche Implementierung entfernen musste, die von json.NET serialisiert wird, da ich nicht finden konnte Config Optionen um eine json-Ausgabe als Ember-Data zu erzeugen (wie in {resource_name : [json, json,...]}
). Der Nebeneffekt davon ist, dass ich die integrierte OData-Unterstützung verloren habe, aber ich möchte sie behalten. Weiß jemand, wie ich es konfigurieren könnte, um verschiedene json für eine Sammlung zu produzieren?
Beide Antworten haben geholfen, ich denke, ich wusste wirklich nicht, wo ich die Mappings einstellen soll. Jetzt beginne ich endlich mit den Ansichten und Vorlagen zu arbeiten. Danke Sylvain – MilkyWayJoe
Zuletzt konnte ich keine Details zu 'Mappings' finden.Könnten Sie darauf hinweisen, wo ich es hätte finden können? Wenn es nur im Quellcode ist? Es könnte/sollte in der Readme tho verfügbar sein. – MilkyWayJoe
Gern geschehen :) –