gpt4 book ai didi

ember.js - 命名多个或适合emberjs应用的 namespace 的最佳方法

转载 作者:行者123 更新时间:2023-12-02 06:01:10 25 4
gpt4 key购买 nike

首先,祝您圣诞快乐,并感谢您的建议。

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

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

                **Approach 1** 

//每个具有自己 namespace 的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应用共享一个 namespace ,但实例不同
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应用的一个 namespace ,但该 namespace 有多个子类
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.在这三种方法中,我仍然可以使用hasMany和belongsTo关联 Ember 数据模型吗?
  • 我仍然不确定如何处理路由器。您认为命名空间应该位于主应用程序和每个rails引擎中,以便它们仍可以无缝运行。
  • 您对如何处理ember-data DS.store命名空间有何建议,因为每个ember-data模型将被命名为每个引擎的命名空间,我仍然希望ember-data DS.Store能够识别并使用其中包含的不同emberjs模型引擎。
  • 是Ember.Namespace自动初始化的,就像Ember.Application是自动初始化的一样。
  • 欢迎使用其他模式。

  • 非常感谢您的宝贵时间。

    最佳答案

    修改后的方法2似乎是可行的方法。所有不同的emberjs应用程序仍将共享一个 namespace ,但是它们将共享一个实例,而不是该 namespace 的不同实例。最终 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应用的 namespace 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033765/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com