【问题标题】:Best way to namespace multiple or suit of emberjs apps命名多个或一套 emberjs 应用程序的最佳方式
【发布时间】:2012-12-11 14:36:49
【问题描述】:

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

我的问题仍然是关于 emberjs 命名空间,但这次是在一组多个 emberjs 应用程序的上下文中,这些应用程序将包含在多个 rails-engine 中,因此每个 emberjs 应用程序都是具有自己的控制器、模型、视图的独立应用程序和路由器。但是,他们仍然需要共享 ember-data 关联。这些 rails-engines 将依次包含在 main-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-engine 中,以便它们仍然可以无缝工作。

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

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

  4. 欢迎使用替代模式。

非常感谢您的宝贵时间。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    修改后的方法 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2010-09-10
      相关资源
      最近更新 更多