有关系的Emberjs模型会抛出错误:“无法设置未定义的属性'store'”

时间:2014-02-20 04:49:08

标签: ember.js ember-data

我正在尝试使用我的工作来看看我们是否应该将它用于未来的应用程序我正在做一个简单的测试应用程序我想尝试模型之间的关系。这是我定义模型的代码:

var App = Ember.Application.create();

App.Router.map(function () {
    this.resource('index', {path: "/"}, function () {
        this.resource("config", {path: "/config/:config_id"});
    });
});

App.Store = DS.Store.extend();

App.Conf = DS.Model.extend({
    module : DS.attr(),
    reports: DS.hasMany('report'),
    isClean: function() {
        return !this.get('reports').isAny('isClean', false);
    }.property('reports.@each')
});


App.Report = DS.Model.extend({
    country: DS.attr(),
    google_account_id: DS.attr(),
    web_property_id: DS.attr(),
    custom_source_uid: DS.attr(),
    isClean: function() {
        return (
                this.get('country') != '' &&
                this.get('google_account_id') != '' &&
                this.get('web_property_id') != '' &&
                this.get('custom_source_uid') != ''
                );
    }.property('country', 'google_account_id', 'web_property_id', 'custom_source_uid')
});

App.ApplicationAdapter = DS.RESTAdapter.extend({
    host: 'http://playground.loc/battle_of_frameworks/json.php'
});

...这里是正在加载的JSON:

我得到的错误是:

  

加载路径时出错:TypeError:无法设置未定义的属性'store'

我用Google搜索了问题,通常是将模型命名为复数形式(即:App.Reports),我不会这样做。所以我不确定这里的问题是什么。任何人都可以提供任何见解吗?

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题。

您的服务器未提供Ember Data预期的有效负载。如果您无法使用后端生成正确的json有效负载,我建议您阅读有关自定义序列化程序的this document

Ember.js是关于配置的约定。现在,你没有遵循这些惯例:

  • 属性来源

    App.Report = DS.Model.extend({
        googleAccountId: DS.attr() //instead of google_account_id
    });
    
  • 您无需创建索引路由it comes for free in Ember。所以你的路由器应该看起来像:

    App.Router.map(function () { this.resource("config", {path: "/config/:config_id"}); });

  • 您确定后端希望从Config而不是/config/:config_id投放/configs/:config_id吗?

  • 您声明了config资源。惯例是拥有App.Config模型,而不是App.Conf

为了清理代码,您还可以利用计算属性来干燥代码:

App.Report = DS.Model.extend({
  country: DS.attr(),
  googleAccountId: DS.attr(),
  webPropertyId: DS.attr(),
  customSourceUid: DS.attr(),
  isClean: Ember.computed.and('country', 'googleAccountId', 'webPropertyId', 'customSourceUid')
});

在基于数组定义计算属性时,还需要注意。 isClean的{​​{1}}使用Config isClean,但您的计算属性仅会观察Report关联的元素。正确的写作方式是:

Report

我希望这会有所帮助。