Actualmente estoy tratando de poner algo junto con ember + emberdata + router + asp.net web api. La mayor parte parece funcionar, sin embargo, me quedé atrapado en un mensaje de error que recibí cuando ember-data intentó findAll
a través del adaptador para mis modelos.Ember-Data: ¿Cómo funcionan las "asignaciones"
En mi backend Tengo un modelo como este (C#):
public class Genre {
[Key]
public int Id { get; set; }
[Required]
[StringLength(50, MinimumLength=3)]
public string Name { get; set; }
}
Que en mi aplicación lo represento como esto utilizando brasa-datos:
App.Genre = DS.Model.extend({
id: DS.attr("number"),
name: DS.attr("string")
}).reopenClass({
url: 'api/genre'
});
que también tienen una tienda define en mi aplicación con la RESTAdapter así:
App.store = DS.Store.create({
revision: 4,
adapter: DS.RESTAdapter.create({
bulkCommit: false
})
});
Y la tienda se utiliza en mi controlador de la siguiente manera:
App.GenreController = Ember.ArrayController.extend({
content: App.store.findAll(App.Genre),
selectedGenre: null
});
El router se define como
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');
}
})
}),
//...
})
})
Cuando ejecuto mi aplicación, me sale el siguiente mensaje para cada objeto que tiene esta misma estructura:
Uncaught Error: assertion failed: Your server returned a hash with the key 0 but you have no mappings
Como referencia, aquí está el json el servicio está volviendo:
[
{
"id": 1,
"name": "Action"
},
{
"id": 2,
"name": "Drama"
},
{
"id": 3,
"name": "Comedy"
},
{
"id": 4,
"name": "Romance"
}
]
No puedo decir exactamente cuál es el problema y dado que la afirmación está mencionando que necesito mapeo, me gustaría saber:
- Lo que esta asignación es y la forma de utilizarlo.
- Dado que el json devuelto es una matriz, ¿debería utilizar un tipo diferente de controlador en mi aplicación, o hay algo que deba saber al trabajar con este tipo de json en Ember-Data? o debería cambiar las opciones de JsonFormatter en el servidor?
Cualquier ayuda es bienvenida.
Definitivamente puedo agregar más información si cree que esto no es suficiente para entender el problema.
EDITAR: he cambiado algunas cosas en mi backend y ahora mi findAll()
acción equivalente en el servidor de la serializa el resultado que el siguiente JSON:
{
"genres": [
{ "id": 1, "name": "Action" },
{ "id": 2, "name": "Drama" },
{ "id": 3, "name": "Comedy" },
{ "id": 4, "name": "Romance" }
]
}
Pero todavía no puede conseguir que pueblan mis modelos en el cliente y mi mensaje de error ha cambiado a esto:
Uncaught Error: assertion failed: Your server returned a hash with the key genres but you have no mappings
No está seguro de qué otra cosa podría estar haciendo mal.
El método que lanza esta excepción es sideload
y comprueba si las asignaciones de esta manera:
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);
//...
Esta llamada sideloadedType = type.typeForAssociation(prop);
vuelve undefined
y luego me sale el mensaje de error. El método typeForAssociation()
comprueba la clave 'associationsByName'
que devuelve un Ember.Map
vacío.
Todavía no hay solución para esto en este momento.
Por cierto ...
Mi acción es ahora así:
// GET api/genres
public object GetGenres() {
return new { genres = context.Genres.AsQueryable() };
}
// GET api/genres
//[Queryable]
//public IQueryable<Genre> GetGenres()
//{
// return context.Genres.AsQueryable();
//}
tuve que quitar la implementación original que obtiene serializado por json.NET ya que no pude encontrar config opciones para producir una salida json como espera Ember-Data (como en {resource_name : [json, json,...]}
). El efecto secundario de esto es que he perdido el soporte incorporado de OData, pero me gustaría conservarlo. ¿Alguien sabe cómo podría configurarlo para producir json diferente para una colección?
Ambas respuestas ayudaron, creo que realmente no sabía dónde establecer las asignaciones. Ahora finalmente voy a empezar a trabajar con las vistas y las plantillas. Gracias Sylvain – MilkyWayJoe
Última cosa sobre esto, no he podido encontrar ninguna información específica sobre 'mappings'.¿Podría señalar dónde podría haberlo encontrado? Si solo está en el código fuente? Podría/debería estar disponible en el léame tho. – MilkyWayJoe
De nada :) –