【问题标题】:Ember fixtures not working灰烬固定装置不起作用
【发布时间】:2014-11-02 20:26:36
【问题描述】:

这是我的代码(使用 ember-cli):

app.coffee

`import Ember from 'ember'`
`import Resolver from 'ember/resolver'`
`import loadInitializers from 'ember/load-initializers'`

Ember.MODEL_FACTORY_INJECTIONS = true

App = Ember.Application.extend
  modulePrefix: 'dashboard' # TODO: loaded via config
  Resolver: Resolver


loadInitializers App, 'dashboard'

`export default App`

适配器/application.coffee

`import DS from 'ember-data'`

ApplicationAdapter = DS.FixtureAdapter.extend()

`export default ApplicationAdapter`

models/mod.coffee

`import DS from 'ember-data'`

Mod = DS.Model.extend 
  name: DS.attr 'string'
  body: DS.attr 'string'
  summary: DS.attr 'string'
  category: DS.attr 'string'

Mod.reopenClass {
  FIXTURES: [
    {
      id: 1
      name: "First mod"
      body: "..."
      summary: "..."
      category: "api"
    },
    {
      id: 2
      name: "Second mod"
      body: "..."
      summary: "..."
      category: "api"
    }
  ]
}

`export default Mod`

但是在应用程序中,当我运行 ember serve 或在浏览器控制台中都没有抛出任何东西(输出:

DEBUG: ------------------------------- vendor.js:27630
DEBUG: Ember      : 1.7.0 vendor.js:27630
DEBUG: Ember Data : 1.0.0-beta.8.2a68c63a vendor.js:27630
DEBUG: Handlebars : 1.3.0 vendor.js:27630
DEBUG: jQuery     : 1.11.1 vendor.js:27630
DEBUG: ------------------------------- vendor.js:27630
generated -> route:application Object {fullName: "route:application"} vendor.js:27630
generated -> route:index Object {fullName: "route:index"} vendor.js:27630
generated -> controller:application Object {fullName: "controller:application"} vendor.js:27630
Rendering application with default view <dashboard@view:toplevel::ember323> Object {fullName: "view:application"} vendor.js:27630
generated -> controller:index Object {fullName: "controller:index"} vendor.js:27630
Rendering index with <dashboard@view:index::ember339> Object {fullName: "view:index"} vendor.js:27630
Ember Debugger Active 

)

在 ember 检查器中,它显示了我的 mod 模型,但没有记录

这里是整个 github repo https://github.com/OpenCubes/dashboard/tree/temp

【问题讨论】:

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


【解决方案1】:

好的 2 件事。

如果要获取整个集合,首先必须生成一个路由。默认情况下,我们主动生成的路由不会这样做。我相信这只是与歧义有关,而且我们不想意外获取您的整个数据源,因此我们将这留给用户去做。

// app/routes/mods.js
import Ember from 'ember';
export default Ember.Route.extend({
  model: function() { return this.store.find('mod'); }
});

其次,您必须在提供固定装置时使用reopenClass。这是因为 IE6 + 没有办法正确地将静态/类变量传播给后代。所以 ember 实现了自己的机制。在将来的某个时间点setPrototypeOf 将可用,我们可以推迟。在此之前,对于 ember-cli 应用程序,请使用 embers 认可的方式。

import DS from 'ember-data';
var Mod = DS.Model.extend({...})
Mod.reopenClass({
  FIXTURES: [
  ...
  ]
});
export default Mod;

然后就可以了

【讨论】:

  • 对于始终通过夹具加载但没有/需要路由的数据,您是否建议在初始化程序中为它们调用 store.find()?
【解决方案2】:

更新

您好,我已将该代码移至 cli,基本上,我所要做的就是:

Mod创建一个适配器:

C:\>ember g adapter mod

然后我去生成的Mod适配器的源,并将声明更改为从FixtureAdapter扩展而不是RESTAdapter

import DS from 'ember-data';

export default DS.FixtureAdapter.extend();

另外,必须更改模型声明,现在和你的几乎一样。 无需创建商店或任何东西。


我真的不知道这是否是您遇到问题的原因,但是,您是否覆盖了商店中的适配器?我怀疑它可能没有使用您的适配器。

我制作了一个快速示例 (here),您可以用作参考。

请注意,在下面的示例中,我将夹具适配器名称作为字符串传递给商店(还有其他方法可以做到这一点)。

App.ApplicationAdapter = DS.FixtureAdapter.extend();

App.Store = DS.Store.extend({
  // override default adapter
  adapter: 'ApplicationAdapter'
});

[ ... other code ... ]

App.Colour = DS.Model.extend({
  name: DS.attr('string'),
  hex: DS.attr('string')
});

// settings the fixtures directly in the model class
App.Colour.FIXTURES = [
  {id: 1, name: 'red', hex: '#F00'}, 
  {id: 2, name: 'green', hex: '#0F0'},
  {id: 3, name: 'blue', hex: '#00F'}
];

然后在我的路线中我正常查询:

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('colour');
  } 
});

这样应该可以正常输出灯具记录了。

【讨论】:

  • 谢谢。既然我使用的是 ember-cli,我应该把 App.store 放在哪里?
  • 您是否在应用中定义了商店?如果是,那么它应该在那个文件上。
  • 我相信没有这样的生成器
  • 我想我上次手动创建了 store.js 文件,但我使用的是 cli.40;我有一段时间没有使用夹具适配器了。现在用本地服务器测试我的东西
猜你喜欢
  • 1970-01-01
  • 2018-11-26
  • 2020-03-23
  • 1970-01-01
  • 2013-09-18
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多