使用LocalStorage适配器在Ember中使用fixture

时间:2014-07-28 19:36:50

标签: javascript ember.js ember-data

我正在构建一个Ember应用程序,该应用程序使用LocalStorage适配器来保存和检索模型,但是在测试时能够将某些模型预加载到应用程序中会非常方便。标准方式似乎是切换应用程序的普通存储适配器以支持FixtureAdapter,但我对应用程序的配置与应用程序在生产中的运行方式有很大不同的测试令人不舒服。我更喜欢保留LocalStorage适配器以进行测试,以便我测试真实的商店行为。

这是我的商店定义:

App.ApplicationSerializer = DS.LSSerializer.extend();
App.ApplicationAdapter = DS.LSAdapter.extend({
    namespace: 'App'
});
App.store = DS.Store.extend();

我试图像这样手动预加载我的模型:

App.store.push(
    "myModel", {
      id: 1,
      someProperty: "a"
 });

但我得到的只是"无法读取属性'推送'未定义的",它告诉我,这一切都是错的。有没有办法使用FixtureAdapter以外的适配器将模型预加载到Ember应用程序中?或者也可以将FixtureAdapter与另一个适配器并排使用?

2 个答案:

答案 0 :(得分:3)

商店由初始化程序初始化。在您的特定情况下,App.store是一个类定义,而不是一个实例,而不是您想要使用该模式。

App.initializer({
    name:'fixtureInjector',
    after:['store'],

    initialize: function (container, application) {
        var store = container.lookup('store:main');
        store.push("myModel", {
          id: 1,
          someProperty: "a"
        });
    }
});

示例:http://emberjs.jsbin.com/OxIDiVU/882/edit

如果您不想使用容器/初始化程序,也可以在应用程序路径中执行此操作。

App.ApplicationRoute = Em.Route.extend({
  beforeModel: function(){
    this.store.push("myModel", {
      id: 1,
      someProperty: "a"
    });
  }
});

答案 1 :(得分:0)

可能有点偏离主题,但我想预先播种本地存储数据,然后使用持久化数据,如果无论如何修改了种子数据。我选择使用一个简单的beforeModel钩子。例如,见下面的一个简单的todolist:

import Ember from 'ember';

export default Ember.Route.extend({
  beforeModel(){
    this.store.findAll('todo').then((data)=> {
      if (data.get('length') == 0) {
        this.store.createRecord('todo',{title: 'get milk',isComplete:     false}).save();
        this.store.createRecord('todo',{title: 'pick up clothes',isComplete: false}).save();
        this.store.createRecord('todo',{title: 'be amazing',isComplete: false}).save();
      }
    })
  },
  model(){
    return this.store.findAll('todo');
  }
});