我目前正试图与Ember + emberdata +路由器+ asp.net网站的API来把东西在一起。 大部分似乎工作,但我被困在一条错误消息时烬数据尝试,我得到findAll
通过适配器我的模型。
在我的后端我有这样(C#)的模型:
public class Genre {
[Key]
public int Id { get; set; }
[Required]
[StringLength(50, MinimumLength=3)]
public string Name { get; set; }
}
这在我的应用我代表像这样使用烬数据:
App.Genre = DS.Model.extend({
id: DS.attr("number"),
name: DS.attr("string")
}).reopenClass({
url: 'api/genre'
});
我也使用像这样的RESTAdapter在我的应用程序定义的商店:
App.store = DS.Store.create({
revision: 4,
adapter: DS.RESTAdapter.create({
bulkCommit: false
})
});
与实体店就在我的控制器如下使用:
App.GenreController = Ember.ArrayController.extend({
content: App.store.findAll(App.Genre),
selectedGenre: null
});
路由器被定义为
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');
}
})
}),
//...
})
})
当我运行我的应用程序,我得到具有此相同的结构中的每个对象的以下信息:
未捕获的错误:断言失败:您的服务器与键返回0哈希,但你有没有映射
作为参考,这里的服务返回JSON:
[
{
"id": 1,
"name": "Action"
},
{
"id": 2,
"name": "Drama"
},
{
"id": 3,
"name": "Comedy"
},
{
"id": 4,
"name": "Romance"
}
]
我不能告诉正是问题是什么,因为断言提的是,我需要映射,我想知道:
- 什么这个映射以及如何使用它。
- 由于返回JSON是一个数组,我应该在我的应用程序使用不同类型的控制器,或者是有什么我应该知道,在灰烬数据这种类型的JSON的工作是什么时候? 或者我应该改变服务器的JsonFormatter选项?
任何帮助是值得欢迎的。
如果你觉得这还不够了解的问题我可以肯定地添加更多的信息。
编辑 :我已经在我的后端改变了一些东西,现在我findAll()
在服务器相当于动作序列化输出为以下JSON:
{
"genres": [
{ "id": 1, "name": "Action" },
{ "id": 2, "name": "Drama" },
{ "id": 3, "name": "Comedy" },
{ "id": 4, "name": "Romance" }
]
}
但我仍然不能得到它来填充我的模型在客户端和我的错误信息已更改为这样:
未捕获的错误:断言失败:你的服务器的密钥类型返回的哈希,但你有没有映射
不知道还有什么我可能是做错了。
抛出此异常的方法是sideload
,并检查这样的映射:
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);
//...
这个呼叫sideloadedType = type.typeForAssociation(prop);
返回undefined
,然后我得到的错误信息。 该方法typeForAssociation()
检查用于为'associationsByName'
键,它返回一个空Ember.Map
。
不过在目前这个无解。
顺便说说...
我现在就行动起来是这样的:
// GET api/genres
public object GetGenres() {
return new { genres = context.Genres.AsQueryable() };
}
// GET api/genres
//[Queryable]
//public IQueryable<Genre> GetGenres()
//{
// return context.Genres.AsQueryable();
//}
我不得不删除其被通过序列化的原始实现json.NET ,因为我无法找到的配置选项为灰烬,数据预计将产生JSON输出(如{resource_name : [json, json,...]}
这种副作用是,我已经失去了内置的OData的支持,但我想保留它。 有谁知道我怎么可以配置它来产生不同的JSON的集合?