ember.js - 为多个或一组 emberjs 应用程序命名的最佳方式

标签 ember.js ember-data

首先祝您圣诞快乐,感谢您提供建议。

我的问题仍然是关于 emberjs 命名空间,但这次是在一套多个 emberjs 应用程序的上下文中,这些应用程序将包含在多个 Rails 引擎中,因此每个 emberjs 应用程序都是一个独立的应用程序,拥有自己的 Controller 、模型、 View 和路由器。然而,他们仍然需要共享 ember 数据关联。这些 Rails 引擎将依次包含在主 Rails 应用程序中,其中每个引擎代表应用程序的一个主要功能。

在此jsfiddle ,我想出了 3 种命名空间方法,但我想知道哪一种是 emberjs 方法:

                **Approach 1** 

//每个emberjs应用都有自己的命名空间

MainRailsApp = Ember.Application.create();

RailsEngine = Ember.Namespace.create();

RailsEngine2 = Ember.Namespace.create();

MainRailsApp.Store= DS.Store.extend();    **inherits from Ember.Application**
MainRailsApp.Router = Em.Router.extend()  **inherits from Ember.Application**

console.log(RailsEngine.toString());       //RailsEngine
console.log(RailsEngine2.toString());      //RailsEngine2


RailsEngine.Model = DS.Model.extend
RailsEngine2.model = DS.Model.extend

该模型是否可以共享关联,尽管它们继承自不同的命名空间

Contact.Model = RailsEngine.Model.extend({
       address:   DS.attr('string'),
       user:      DS.belongsTo('User.Model')      
});

User.Model = RailsEngine2.Model.extend({
      name: DS.attr('string'),
      contacts: DS.hasMany('Contact.Model'),

});



                 **Approach 2**

//所有不同的emberjs应用共享一个命名空间但不同的实例

Yp = Ember.Namespace.extend();

UserRailsEngine = Yp.create();

ContactRailsEngine = Yp.create();

PaymentRailsEngine = Yp.create();

Yp.Jk = Ember.Application.extend();

Yp.Jk.create();
Yp.Router = Em.Router.extend();      **inherits from the Ember.Namespace**
Yp.Store = DS.Store.extend({ });     **inherits from the Ember.Namespace**


console.log(UserRailsEngine.toString());         //UserRailsEngine

console.log(PaymentRailsEngine.toString());      //PaymentRailsEngine

UserRailsEngine.Model = DS.Model.extend
ContactRailsEngine.Model = DS.Model.extend

该模型是否可以共享关联,它们有一个命名空间但有不同的实例

Contact.Model = ContactRailsEngine.Model .extend({
       address:   DS.attr('string'),
       user:      DS.belongsTo('User.Model')      
});

User.Model = UserRailsEngine.Modelextend({
      name: DS.attr('string'),
      contacts: DS.hasMany('Contact.Model')    
});


            **Approach 3**

//每个 emberjs 应用有一个命名空间,但有多个命名空间子类

Mynamespace = Ember.Namespace.extend();

Order = Mynamespace.extend();

OrderRailsEngine = Order.create();

Event = Mynamespace.extend();

EventRailsEngine = Event.create();

console.log(OrderRailsEngine.toString());           //OrderRailsEngine

console.log(EventRailsEngine.toString());           //EventRailsEngine


**Additional questions**

1.我是否仍然可以在所有 3 种方法中使用 hasMany 和 BelongsTo 关联 ember-data 模型。

  1. 我仍然不确定路由器将如何处理。您认为主应用程序和每个 Rails 引擎中的命名空间应该位于什么位置,以便它们仍然无缝工作。

  2. 您对如何处理 ember-data DS.Store 命名空间有什么建议,因为每个 ember-data 模型都会为每个引擎命名,而且我仍然希望 ember-data DS.Store 能够识别并使用引擎中包含不同的 emberjs 模型。

  3. Ember.Namespace 是否自动初始化,就像 Ember.Application 自动初始化一样。

  4. 欢迎使用替代模式。

非常感谢您抽出时间。

最佳答案

修改后的 approah 2 似乎是 emberjs 的最佳选择。所有不同的 emberjs 应用程序仍将共享一个命名空间,但它们将共享一个实例,而不是该命名空间的不同实例。最终 jsfiddle

这种方法可以从下面粘贴的代码中看出,该代码是从下面的链接中提取的:

https://github.com/emberjs/data/blob/master/packages/ember-data/tests/integration/embedded/embedded_dirtying_test.js

var attr = DS.attr;
var Post, Comment, User, Vote, Blog;
var Adapter, App;
var adapter, store, post;
var forEach = Ember.EnumerableUtils.forEach;

App = Ember.Namespace.create({ name: "App" });

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

Vote = App.Vote = DS.Model.extend({
  voter: attr('string')
});

Comment = App.Comment = DS.Model.extend({
  title: attr('string'),
  user: DS.belongsTo(User),
  votes: DS.hasMany(Vote)
});

Blog = App.Blog = DS.Model.extend({
  title: attr('string')
});

Post = App.Post = DS.Model.extend({
  title: attr('string'),
  comments: DS.hasMany(Comment),
  blog: DS.belongsTo(Blog)
});

Adapter = DS.RESTAdapter.extend();

Adapter.map(Comment, {
  user: { embedded: 'always' },
  votes: { embedded: 'always' }
});

Adapter.map(Post, {
  comments: { embedded: 'always' },
  blog: { embedded: 'load' }
});

adapter = Adapter.create();

store = DS.Store.create({
  adapter: adapter
});

因此,在跨 Rails 引擎使用它的竞赛中,它变成了:

   //App = Ember.Namespace.create();
 App = Ember.Namespace.create({ name: "App" });
 Main = App.MainApp = Ember.Application.extend();
 Main.create();

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

 VoteEngine = App.VoteEngine = DS.Model.extend({
   voter: DS.attr('string')
 });

 console.log(Main.toString());                       //App.MainApp
 console.log(UserEngine.toString());                 //App.UserEngine 
 console.log(VoteEngine.toString());                 //App.VoteEngine 

关于ember.js - 为多个或一组 emberjs 应用程序命名的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033765/

相关文章:

ember.js - Ember 中不同表单输入的内联/就地编辑

javascript - 无法使用 RESTSerializer 加载数据

ruby-on-rails - 使用 Ember.js & Ember-data & Rails 创建记录并处理记录列表

ember.js - ember-data 1.0 beta 中的嵌入记录

ember.js - Ember.js 如何防止 CreateRecord 和 Commit 重复记录?

javascript - 将 $.getJSON 对象传递给另一个 ember Controller

javascript - Emberjs - 直接调用嵌套资源的 URL

ember.js - EmberJS 在有效负载 JSONAPI 中嵌入了项目

javascript - Ember-data 通过 id 和其他参数查找记录?

javascript - 从 JavaScript 转换 Ember.js 应用程序