gpt4 book ai didi

javascript - Ember-Data: "mappings"是如何工作的

转载 作者:可可西里 更新时间:2023-11-01 02:17:30 27 4
gpt4 key购买 nike

我目前正在尝试将一些东西与 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
})
});

商店在我的 Controller 中使用如下:

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

//...
})
})

当我运行我的应用程序时,对于具有相同结构的每个对象,我都会收到以下消息:

Uncaught Error: assertion failed: Your server returned a hash with the key 0 but you have no mappings

作为引用,这里是服务返回的 json:

[
{
"id": 1,
"name": "Action"
},
{
"id": 2,
"name": "Drama"
},
{
"id": 3,
"name": "Comedy"
},
{
"id": 4,
"name": "Romance"
}
]

我不能确切地说出问题是什么,因为断言提到我需要映射,我想知道:

  1. 这个映射是什么以及如何使用它。
  2. 由于返回的 json 是一个数组,我是否应该在我的应用程序中使用不同类型的 Controller ,或者在 ember-data 中使用这种类型的 json 时我应该了解什么?还是应该更改服务器中的 JsonFormatter 选项?

欢迎任何帮助。

如果您觉得这不足以理解问题,我绝对可以添加更多信息。

编辑:我在后端更改了一些内容,现在我在服务器中的 findAll() 等效操作将输出序列化为以下 json:

{
"genres": [
{ "id": 1, "name": "Action" },
{ "id": 2, "name": "Drama" },
{ "id": 3, "name": "Comedy" },
{ "id": 4, "name": "Romance" }
]
}

但我仍然无法在客户端中填充我的模型,我的错误消息已更改为:

Uncaught Error: assertion failed: Your server returned a hash with the key genres but you have no mappings

不确定我还做错了什么。

抛出这个异常的方法是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() 方法检查返回空 Ember.Map'associationsByName' 键。

目前还没有解决这个问题。

顺便...

我现在的 Action 是这样的:

    // 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?

最佳答案

可以在 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
});

希望这能解决您的问题。

更新:

目前,这还没有很好的记录,我不记得是我们自己阅读代码发现的,还是 Tom Dale 指出的。
无论如何,这是plurals的重点对于映射,我认为我们和您一样被同样的错误所驱使,要么我们尝试过,要么是 Tom 教给我们的。

关于javascript - Ember-Data: "mappings"是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12182866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com