Javascript 余烬数据:怎么做;“映射”;工作

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({

我目前正在尝试将ember+emberdata+router+asp.NETWebAPI结合起来。大部分似乎都能工作,但是当ember data试图通过我的模型适配器
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"
  }
]
我不能确切地说出问题是什么,因为断言提到我需要映射,我想知道:

  • 这个映射是什么以及如何使用它
  • 由于返回的json是一个数组,我应该在我的应用程序中使用不同类型的控制器,还是在ember数据中使用这种类型的json时应该知道什么?还是应该更改服务器中的JsonFormatter选项 欢迎任何帮助

    如果您觉得这还不足以理解问题,我肯定可以添加更多信息

    EDIT:我在后端做了一些更改,现在服务器中的
    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最后一件事,我找不到关于
    映射的任何细节。你能指出我在哪里能找到它吗?如果只是源代码?它可以/应该在自述文件中提供。