Ember-Data 2.1.0有很多不能正常工作(无法读取属性'取代未定义的)

时间:2015-11-12 13:34:35

标签: ember.js ember-data ember-cli

我到处搜索,但似乎无法在这里找到这个简单问题的答案。

问题:

我在一个模型中有一个hasMany关系,该模型由findAll()中的路由加载。根据我在这里看到的很多答案,有效负载看起来很好,但我得到了#34; TypeError:无法读取属性'替换'未定义"。更多细节如下。

我怎样才能让这个有很多关系起作用?我使用asynch:false并按照建议发送了sideload。

使用:Ember 2.1.0,Ember-Data 2.1.0。

堆栈跟踪:

TypeError: Cannot read property 'replace' of undefined
    at Object.func (ember.debug.js:36026)
    at Object.Cache.get (ember.debug.js:13165)
    at decamelize (ember.debug.js:36068)
    at Object.func (ember.debug.js:35974)
    at Object.Cache.get (ember.debug.js:13165)
    at Object.dasherize (ember.debug.js:36072)
    at ember$data$lib$system$normalize$model$name$$normalizeModelName (normalize-model-name.js:13)
    at ember$data$lib$serializers$json$serializer$$default.extend.modelNameFromPayloadKey (json-api-serializer.js:267)
    at ember$data$lib$serializers$json$serializer$$default.extend._extractType (json-api-serializer.js:258)
    at ember$data$lib$serializers$json$serializer$$default.extend.normalize (json-api-serializer.js:290)

路线:

应用程序/路由/ search.js

export default Ember.Route.extend({

    model(params) {
        if(params.query){
            return this.store.findAll('search-result');
        }
        return null;
    },

    actions:{
        sendSearch: function(queryString){
            this.store.unloadAll('search-result');
            this.refresh();
        }
    }

});

型号:

应用程序/模型/搜索result.js

import DS from 'ember-data';

export default DS.Model.extend({

  title:        DS.attr('string'),
  description:  DS.attr('string'),
  url:          DS.attr('string'),
  tags:         DS.hasMany('search-result-tag', {async:false})

});

应用程序/模型/搜索结果-tag.js

import DS from 'ember-data';

export default DS.Model.extend({

  name: DS.attr('string'), 

});

适配器(搜索结果)

import DS from 'ember-data';

export default DS.RESTAdapter.extend({

    host: 'http://localhost:8080',
    urlForFindRecord(id, modelName, snapshot) {
        let url = this._super(...arguments);
        let query = Ember.get(snapshot, 'adapterOptions.query');
        if (query) {
            url += '?' + Ember.$.param(query); // assumes no query params are present already
        }
        return url;
    },
    urlForFindAll(modelName) {

        var queryDict = {};
        location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})

        let url = this._super(...arguments);
        let query = queryDict['query'];

        if (query) {
            url += '?query=' + query; // assumes no query params are present already
        }

        return url;
    }

});

有效载荷

{
  "search-result-tags": [
    {
      "name": "this-is-tag-#-0",
      "id": 0
    }
  ],
  "search-results": [
    {
      "description": "This is description for blabla2",
      "id": 0,
      "title": "Blabla 2",
      "url": "http://blablabla2.com",
      "tags": []
    },
    {
      "description": "This is description for blabla",
      "id": 1,
      "title": "Blabla",
      "url": "http://blabla.com",
      "tags": [
        0
      ]
    }
  ]
}

1 个答案:

答案 0 :(得分:2)

除了RESTSerializer之外,您还需要使用RESTAdapter。所以app/serializers/application.js将是 -

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
});

请参阅docs。如果您需要更改密钥的大小写/下划线,则可能需要覆盖keyForAttribute

请注意,如果您使用Rails API作为后端,则需要ActiveModelAdapterActiveModelSerializeraddon