Ember-Data:“映射”如何工作
Posted
技术标签:
【中文标题】Ember-Data:“映射”如何工作【英文标题】:Ember-Data: How do "mappings" work 【发布时间】:2012-08-24 08:30:24 【问题描述】:我目前正在尝试将 ember + emberdata + router + asp.net web api 放在一起。大部分似乎都有效,但是当 ember-data 尝试通过我的模型的适配器findAll
时,我遇到了一条错误消息。
在我的后端我有一个这样的模型(C#):
public class Genre
[Key]
public int Id get; set;
[Required]
[StringLength(50, MinimumLength=3)]
public string Name get; set;
在我的应用中,我使用 ember-data 来表示它:
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 是一个数组,我应该在我的应用程序中使用不同类型的控制器,还是在 ember-data 中使用这种类型的 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 序列化的原始实现,因为我找不到配置选项来生成 Ember-Data 期望的 json 输出(如在 resource_name : [json, json,...]
中)。这样做的副作用是我失去了内置的 OData 支持,但我想保留它。有谁知道我如何配置它来为一个集合生成不同的 json?
【问题讨论】:
【参考方案1】:我正在使用 Ember Data rev. 11
,而 DS.RESTAdapter.create
中的 plurals
配置似乎永远无法正常工作。我查看了代码并找到了如下解决方案:
App.Adapter = DS.RESTAdapter.extend(
bulkCommit: false
)
App.Adapter.configure('plurals',
series: 'series'
)
【讨论】:
【参考方案2】:可以在 DS.RESTAdapter 中定义映射。我认为您可以尝试定义如下内容:
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
);
希望这能解决您的问题。
更新:
目前,这并没有很好的记录,我不记得是我们自己阅读代码发现的,还是汤姆戴尔指出的。 无论如何,这是plurals的重点 对于映射,我认为我们是由与您相同的错误驱动的,要么我们尝试过,要么 Tom 教我们这个。
【讨论】:
两个答案都有帮助,我想我真的不知道在哪里设置映射。现在我终于要开始使用视图和模板了。谢谢西尔万 最后一件事,我在mappings
上找不到任何细节。你能指出我在哪里可以找到它吗?如果它只是在源代码中?它可以/应该在自述文件中提供。【参考方案3】:
RESTAdapter
期望返回的JSON
具有以下形式:
"genres": [
"id": 1,
"name": "action"
,
"id": 2,
"name": "Drama"
]
这些测试是很好的文档来源,请参阅https://github.com/emberjs/data/blob/master/packages/ember-data/tests/unit/rest_adapter_test.js#L315-329
【讨论】:
我设法让我的服务以相同的格式生成 json,但现在我收到消息“未捕获的错误:断言失败:您的服务器返回了包含关键流派的哈希,但您没有映射”。我设法用 ember 0.9.1 加载了一组不同的控制器/模型,没有 ember-data 好吧,不幸的是它不是 json 格式,它现在是别的东西,因为我正在返回上面指示的格式,现在我得到了另一个属性的相同消息,而不再是索引。以上是关于Ember-Data:“映射”如何工作的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Ember.js 和 ember-data 创建新记录?