2012-12-25 47 views
2

首先給你一個聖誕快樂,謝謝你的建議。命名空間多重或套裝的應用程序的最佳途徑

我的問題仍然在emberjs命名空間,但這次是在多套emberjs應用程序的上下文中,這些應用程序將包含在多個rails-engine中,以便每個emberjs應用程序都是獨立的應用程序,並帶有自己的控制器,視圖和路由器。但是,他們仍然需要共享燼數據關聯。這些導軌引擎將包含在主導軌應用程序中,其中每個引擎代表應用程序的主要功能。

在這種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. 歡迎使用其他圖案。

非常感謝您的時間。

回答

4

修改後的approah 2似乎是emberjs的路要走。所有不同的emberjs應用程序仍將共享一個名稱空間,但不是該名稱空間的不同實例,它們將共享一個實例。

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 
}); 

所以在跨越護欄引擎它使用它的比賽:決賽jsfiddle

這種方法可以從下面粘貼的代碼,這是從下面的鏈接中提取可見變爲:

//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