【问题标题】:Emberjs: cannot read property 'type' of undefinedEmberjs:无法读取未定义的属性“类型”
【发布时间】:2016-05-26 13:27:27
【问题描述】:

我在我的 ember 应用中创建了一个名为 ticket-stats 的模型:

import Model from 'ember-data/model';
import attr from 'ember-data/attr';

export default Model.extend({

    get_tickets_more: attr(),
    get_tickets: attr(),
    get_avg_tickets: attr()

});

数据是从 JSON api 中提取的:http://domain.com/data/ticketStats?blah=blah... 所以我为这个模型添加了一个特殊的适配器,叫做ticket-stats:

import JSONAPIAdapter from 'ember-data/adapters/json-api';

export default JSONAPIAdapter.extend({

    host: 'http://domain.com',
    namespace: 'data',

    pathForType: function(type) {
        return Ember.String.camelize(type);
    }
});

我在路由中获得了这个模型的数据:

import Ember from 'ember';

export default Ember.Route.extend({

    model () {
        var ticketData;
        this.store.query('ticket-stats', { teamID: 218, attUID: 'oc7569', useProd: 1})
                .then(function(stats) { ticketData = stats; });

        return Ember.RSVP.hash({
            currentUser: this.currentUser,
            ticketStats: ticketData
        });
    }
});

而且,我得到一个 TypeError:

ember.debug.js:32096 TypeError: Cannot read property 'type' of undefined
    at _pushInternalModel (store.js:1524)
    at push (store.js:1501)
    at finders.js:171
    at Object.Backburner.run (ember.debug.js:678)
    at _adapterRun (store.js:1733)
    at finders.js:168
    at tryCatch (ember.debug.js:53806)
    at invokeCallback (ember.debug.js:53821)
    at publish (ember.debug.js:53789)
    at ember.debug.js:32054onerrorDefault @ ember.debug.js:32096exports.default.trigger @ ember.debug.js:54476(anonymous function) @ ember.debug.js:55727Queue.invoke @ ember.debug.js:333Queue.flush @ ember.debug.js:397DeferredActionQueues.flush @ ember.debug.js:205Backburner.end @ ember.debug.js:560(anonymous function) @ ember.debug.js:1126

关于为什么会发生这种情况的任何想法?当我删除适配器中的 pathForType 函数时,此错误消失,但随后我收到另一个关于从 http://domain.com/data/ticket-stats?... 获取数据的错误,这不是正确的 URL。我必须转换为 camelCase,ticket-stats => ticketStats。

这就是我的 json 的样子:

{
   "get_avg_tickets": { ... },
   "get_tickets_more": { ... },
   "get_tickets": { ... }
}

我还修改了应用程序序列化器,只需将 JSONAPISerializer 替换为 JSONSerializer:app/serializers/application.js

import JSONSerializer from 'ember-data/serializers/json';

export default JSONSerializer.extend({
});

任何帮助将不胜感激!我对 Ember 很陌生。

【问题讨论】:

  • 这是我的 json 的样子:{ "get_avg_tickets": { .. }, "get_tickets_more": { ... }, "get_tickets": { ... } }
  • 使用DS.EmbeddedRecordsMixin时必须实现序列化器。

标签: ember.js ember-data


【解决方案1】:

你需要使用这个序列化器这里是参考链接 http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html

import DS from 'ember-data';

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {
    payload = { ticketStats: payload };
    return this.normalizeArrayResponse(store, primaryModelClass, payload, id, requestType);
  },
});

你的 json 应该是这种格式:

{
   "get_avg_tickets": 45,
   "get_tickets_more": propertyvalue,
   "get_tickets": propertyvalue
}

否则你需要在序列化器的 normalizeQueryreponse 中标准化你的响应

也准备好以下文档为您提供帮助 http://thejsguy.com/2015/12/05/which-ember-data-serializer-should-i-use.html 我希望它会帮助你。不要忘记接受我的回答。

【讨论】:

    【解决方案2】:

    您需要使用最适合您的 json 数据的序列化程序。

    http://emberjs.com/api/data/classes/DS.JSONAPISerializer.html
    

    由于您从 api 收到的 json 数据不完全符合您对 json 格式的应用程序要求,因此引发此错误。

    请在此处分享 json 数据。因为 domain.com json url 不起作用。 您的代码中有很多问题。让我一一指导你

    【讨论】:

    • 我确实为应用程序创建了一个序列化程序,以便它使用 JSONSerializer 而不是 JSONAPISerializer。
    • 分享这个序列化器的代码,也分享json数据。因为您提供的 json url 链接不起作用
    • 我编辑了这篇文章以展示我的 JSON 和我的序列化器的样子。 JSON api 的链接不应该为您工作,它位于 Intranet 网络上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2019-06-03
    • 2017-02-08
    • 2021-01-15
    • 2020-12-29
    • 1970-01-01
    相关资源
    最近更新 更多