11

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

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

     //... 
    }) 
}) 

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:

  1. Was diese Abbildung ist und wie es zu benutzen.
  2. 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?

Antwort

12

Die Abbildung kann in dem DS.RESTAdapter definiert werden. Ich denke, dass Sie versuchen könnten, etwas wie dieses zu definieren:

Hoffe das löst Ihr Problem.

Update:

Zu diesem Zeitpunkt ist das nicht gut dokumentiert, ich erinnere mich nicht, ob wir es von uns selbst Lesen des Codes gefunden, oder vielleicht Tom Dale deutete darauf.
Wie auch immer, hier ist der Punkt für plurals Für die Zuordnungen, ich denke, wir wurden durch den gleichen Fehler wie Sie gefahren, und entweder haben wir versucht, entweder Tom hat uns darüber unterrichtet.

+0

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

+0

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

+0

Gern geschehen :) –

8

Die RESTAdapter erwartet die JSON zurückgegeben von der Form zu sein:

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

Die Tests eine gute Quelle für die Dokumentation sind, siehe https://github.com/emberjs/data/blob/master/packages/ember-data/tests/unit/rest_adapter_test.js#L315-329

+0

ich es geschafft, meinen Dienst zu machen json auf dem gleichen Format zu produzieren, aber jetzt bekomme ich die Meldung „* Nicht abgefangene Fehler: Assertionsfehler: Ihr Server zurückgegeben einen Hash mit den wichtigsten Genres, aber Sie haben keine Zuordnungen * ". Ich habe es geschafft, mit einem anderen Satz von Controllern/Modellen mit ember 0.9.1 und keinen ember-Daten zu laden. – MilkyWayJoe

+0

Nun, leider ist es nicht das JSON Format, es ist etwas anderes, da ich das oben angegebene Format zurückgebe und jetzt bekomme ich das gleiche Nachricht für eine andere Eigenschaft und nicht mehr für den Index. – MilkyWayJoe

3

Ich benutze Ember Data rev. 11 und es scheint, dass die plurals Config in DS.RESTAdapter.create nie funktioniert. Ich schaute in die Codes und eine Lösung wie folgt gefunden:

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

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