在Ember Apps与Ember Data 1.0.0-beta.4(以及适配器和序列化器)之间共享模型

时间:2014-01-10 19:33:48

标签: ember.js ember-data

我正在构建的网站使用多个Ember应用来管理网站的不同区域。过去很容易在应用之间共享模型定义。一个应用程序将定义模型(即App1.Product),另一个应用程序(App2)可以通过在模型本身上调用createRecord来创建它们:App1.Product.createRecord({})

但是,使用Ember Data 1.0,所有记录都是从商店对象创建的。所以这不再适用于App2:

App1.Product = DS.Model.extend({
    name: DS.attr('string'),
    price: DS.attr('number')
});

App2.IndexRoute = Ember.Route.extend({
  setupController: function(controller, products) {
      controller.set('products', [

          // DOESN'T WORK
          this.store.createRecord('product', {name: 'Robot', price: 10.55}),
          this.store.createRecord('product', {name: 'Blocks', price: 4.99})

      ]);
  }
});

这不起作用,因为App2没有在其命名空间中定义任何产品型号定义。

如何在应用程序之间共享模型定义(以及序列化程序和适配器)?我正在做的当前黑客是拥有一个“导入”所有共享模型的JS文件:

App2.Product = App1.Product;

但是对于一长串模型和适配器而言,这会变得乏味。

有没有办法创建其他应用程序继承的shell Ember应用程序? (Ember.Application的实例没有extend方法)。

2 个答案:

答案 0 :(得分:3)

我会考虑使用像requirejs这样的模块加载器。如果您对此不感兴趣,请构建自己的。这是一个简单的例子。

Models = {
  registerModels:function(app){
    var models = Object.keys(this),
        modelName,
        model;

    for(var i = 0; i< models.length;i++){
      modelName = models[i];
      model= this[modelName];

      if (this.hasOwnProperty(modelName) && modelName != 'registerModels'){
         app[modelName] = model;
      }
    }
  }
};

Models.Product = DS.Model.extend({
    name: DS.attr('string'),
    price: DS.attr('number')
});

Models.Color = DS.Model.extend({
    color: DS.attr()
});

Models.registerModels(App);

http://emberjs.jsbin.com/OxIDiVU/120/edit

答案 1 :(得分:0)

我正在使用符号链接。就目前而言,这种解决方案的效果非常好。

以下是设置:我们有一个面向用户的Ember应用程序和一个仅限管理员的应用程序。他们分别在ember/admin/下的同一个回购中。

admin/app/models不是目录,而是:

models -> ../../ember/app/models/

这些链接设置起来非常便宜。跑吧:

ln -s -r path-to-link-destination

一切都像你期望的那样 - 所有的编辑都发生在ember/app/models之下。我的用例中没有遇到任何问题。您还可以使用相同的技术链接特定组件或要在应用程序之间共享的其他文件。

至于缺点 - 在符号链接下更改文件似乎并没有触发ember-cli中的重建,这个解决方案可能无法在Windows上运行。