2

まず、あなたへのメリー クリスマス。提案を手伝ってくれてありがとう。

私の質問はまだ emberjs 名前空間に関するものですが、今回は複数の rails-engine に含まれる複数の emberjs アプリのスイートのコンテキストで、各 emberjs アプリは独自のコントローラー、モデル、ビュー、およびルーターを備えたスタンドアロン アプリです。ただし、ember データの関連付けを共有する必要があります。これらの 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 アプリは 1 つの名前空間を共有しますが、インスタンスは異なります

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

このモデルは関連付けを共有できますか? 名前空間は 1 つですが、インスタンスは異なります

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

//1 つの名前空間ですが、各 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. ルーターがどうなるかはまだわかりません。main-app とそれぞれの rails-engine の名前空間がシームレスに動作するようにするにはどうすればよいと思いますか?

  2. 各 ember-data モデルは各エンジンに名前空間が割り当てられるため、ember-data DS.Store 名前空間を処理する方法に関するあなたの提案は何ですか?エンジン。

  3. Ember.Application が自動初期化されるように、Ember.Namespace は自動初期化されます。

  4. 代替パターンは大歓迎です。

お時間をいただきありがとうございました。

4

1 に答える 1

4

修正されたapproah2は、emberjsの方法のようです。すべての異なるemberjsアプリは引き続き1つの名前空間を共有しますが、その名前空間の異なるインスタンスの代わりに、1つのインスタンスを共有します。最終的な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 
于 2012-12-29T17:30:09.987 に答える