Javascript 余烬数据:怎么做;“映射”;工作
我目前正在尝试将ember+emberdata+router+asp.NETWebAPI结合起来。大部分似乎都能工作,但是当ember data试图通过我的模型适配器Javascript 余烬数据:怎么做;“映射”;工作,javascript,asp.net-web-api,ember.js,ember-data,ember-old-router,Javascript,Asp.net Web Api,Ember.js,Ember Data,Ember Old Router,我目前正在尝试将ember+emberdata+router+asp.NETWebAPI结合起来。大部分似乎都能工作,但是当ember data试图通过我的模型适配器findAll时,我遇到了一条错误消息 在我的后端,我有一个这样的模型(C#): 在我的应用程序中,我使用余烬数据如下所示: App.Genre = DS.Model.extend({ id: DS.attr("number"), name: DS.attr("string") }).reopenClass({
findAll
时,我遇到了一条错误消息
在我的后端,我有一个这样的模型(C#):
在我的应用程序中,我使用余烬数据如下所示:
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"
}
]
我不能确切地说出问题是什么,因为断言提到我需要映射,我想知道:
findAll()
等效操作将输出序列化为以下json:
{
"genres": [
{ "id": 1, "name": "Action" },
{ "id": 2, "name": "Drama" },
{ "id": 3, "name": "Comedy" },
{ "id": 4, "name": "Romance" }
]
}
但我仍然无法让它在客户端中填充我的模型,我的错误消息已更改为:
未捕获错误:断言失败:服务器返回的哈希值为
关键类型,但您没有映射
不知道我还可能做错什么
引发此异常的方法是,并检查以下映射:
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);
//...
// GET api/genres
public object GetGenres() {
return new { genres = context.Genres.AsQueryable() };
}
// GET api/genres
//[Queryable]
//public IQueryable<Genre> GetGenres()
//{
// return context.Genres.AsQueryable();
//}
App.Store = DS.Store.extend({
adapter: DS.RESTAdapter.create({
bulkCommit: true,
mappings: {
genres: App.Genre
},
// you can also define plurals, if there is a unregular plural
// usually, RESTAdapter simply add a 's' for plurals.
// for example at work we have to define something like this
plurals: {
business_process: 'business_processes'
//else it tries to fetch business_processs
}
}),
revision: 4
});
此调用sideloadedType=type.typeForAssociation(prop)
返回未定义
,然后我得到错误消息。方法typeForAssociation()
检查返回空Ember.Map
的'AssociationByName'
键
目前还没有解决办法
顺便说一下…
我现在的行动是这样的:
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);
//...
// GET api/genres
public object GetGenres() {
return new { genres = context.Genres.AsQueryable() };
}
// GET api/genres
//[Queryable]
//public IQueryable<Genre> GetGenres()
//{
// return context.Genres.AsQueryable();
//}
App.Store = DS.Store.extend({
adapter: DS.RESTAdapter.create({
bulkCommit: true,
mappings: {
genres: App.Genre
},
// you can also define plurals, if there is a unregular plural
// usually, RESTAdapter simply add a 's' for plurals.
// for example at work we have to define something like this
plurals: {
business_process: 'business_processes'
//else it tries to fetch business_processs
}
}),
revision: 4
});
//获取api/genres
公共对象GetGenres(){
返回新的{genres=context.genres.AsQueryable()};
}
//获取api/类型
//[可查询]
//公共IQueryable GetGenres()
//{
//返回context.Genres.AsQueryable();
//}
我不得不删除由序列化的原始实现,因为我找不到配置选项来生成Ember数据所期望的json输出(如
{resource_name:[json,json,…]}
)。这样做的副作用是,我失去了内置的OData支持,但我想保留它。有人知道我如何配置它为一个集合生成不同的json吗 RESTAdapter要求返回的JSON
格式为:
{
“流派”:[{
“id”:1,
“名称”:“操作”
},{
“id”:2,
“名称”:“戏剧”
}]
}
这些测试是很好的文档来源,请参见可以在DS.RESTAdapter中定义映射。我想你可以试着这样定义:
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);
//...
// GET api/genres
public object GetGenres() {
return new { genres = context.Genres.AsQueryable() };
}
// GET api/genres
//[Queryable]
//public IQueryable<Genre> GetGenres()
//{
// return context.Genres.AsQueryable();
//}
App.Store = DS.Store.extend({
adapter: DS.RESTAdapter.create({
bulkCommit: true,
mappings: {
genres: App.Genre
},
// you can also define plurals, if there is a unregular plural
// usually, RESTAdapter simply add a 's' for plurals.
// for example at work we have to define something like this
plurals: {
business_process: 'business_processes'
//else it tries to fetch business_processs
}
}),
revision: 4
});
希望这能解决你的问题
更新:
目前,这还没有很好的文档记录,我不记得是我们自己阅读代码发现的,还是Tom Dale指出的。不管怎么说,这就是我的观点
对于映射,我认为我们受到了与您相同的错误的影响,或者我们尝试过,或者Tom教过我们这一点。我使用的是Ember Data
rev。11
而且DS.RESTAdapter.create
中的复数形式
配置似乎不起作用。我查看了代码,找到了如下解决方案:
App.Adapter = DS.RESTAdapter.extend({
bulkCommit: false
})
App.Adapter.configure('plurals', {
series: 'series'
})
我设法让我的服务以相同的格式生成json,但现在我收到消息“未捕获错误:断言失败:您的服务器返回了一个带有密钥类型的哈希,但您没有映射”。我设法用一组不同的控制器/模型加载了ember 0.9.1和no ember dataWell,不幸的是,它不是json格式,现在是另外一种格式,因为我返回了上述格式,现在我得到了另一个属性的相同消息,不再是索引。这两个答案都有帮助,我想我真的不知道在哪里设置映射。现在我终于要开始使用视图和模板了。感谢Sylvainl最后一件事,我找不到关于
映射的任何细节。你能指出我在哪里能找到它吗?如果只是源代码?它可以/应该在自述文件中提供。