【问题标题】:Using fixtures in Ember with the LocalStorage adapter在 Ember 中使用带有 LocalStorage 适配器的固定装置
【发布时间】:2014-07-28 19:36:50
【问题描述】:

我正在构建一个 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"
 });

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

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    存储由初始化程序初始化。 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"
        });
      }
    });
    

    【讨论】:

    • Ember 使用您的初始化程序抛出了这个错误:Assertion Failed: No application initializer named 'store:main'。不过,从 ApplicationRoute 加载模型效果很好。
    • 对不起,这只是商店。我在上面添加了一个示例来显示它。查找为store:main,但初始化程序名为store
    【解决方案2】:

    可能有点离题,但我想预先播种本地存储数据,然后在播种数据被修改后使用持久化数据。我选择使用一个简单的 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');
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多