烬-数据:怎么办?“映射”工作(Ember-Data: How do “mappings” work

2019-06-27 13:24发布

我目前正试图与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"
  }
]

我不能告诉正是问题是什么,因为断言提的是,我需要映射,我想知道:

  1. 什么这个映射以及如何使用它。
  2. 由于返回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的集合?

Answer 1:

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

希望这可以解决您的问题。

更新:

在这个时候,这是不是有据可查的,我不记得了,如果我们发现它采用自行阅读代码,或者是汤姆·戴尔指出就可以了。
无论如何,这里是点复数对于映射,我觉得我们被同样的错误,你驱动,要么我们尽力了,无论是汤姆TEACHED我们这一点。



Answer 2:

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



Answer 3:

我使用的灰烬数据rev. 11 rev. 11和它似乎是plurals的配置DS.RESTAdapter.create永远不会奏效。 我看着代码,并找到了解决办法如下:

App.Adapter = DS.RESTAdapter.extend({
  bulkCommit: false
})

App.Adapter.configure('plurals', {
  series: 'series'
})


文章来源: Ember-Data: How do “mappings” work