代码之家  ›  专栏  ›  技术社区  ›  Toran Billups

如何在ember创建对象时初始化实例

  •  1
  • Toran Billups  · 技术社区  · 10 年前

    我正在尝试将一个简单的微风.js数据存储添加到我的ember项目中,我想像现在的ember数据那样注册它。到目前为止,我有一个工作示例,唯一的问题是我需要手动设置存储中的“实例”,然后像这样引用它

    “this.store.exinstance.ssomething()”

    而不是我想要的

    “this.store.something()”

    我在下面做错了什么?

    App.BreezeStore = Ember.Object.extend({
        instance: null,
        init: function() {
            var ds = new breeze.DataService({
                serviceName: 'api',
                hasServerMetadata: false,
                useJsonp: false
            });
            breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
            this.instance = new breeze.EntityManager({dataService: ds});
            this.instance.metadataStore.addEntityType({
                shortName: "Session",
                namespace: "App",
                dataProperties: {
                    id: { dataType: "Int64", isPartOfKey: true },
                    name: { dataType: "String" }
                }
            });
        }
    });
    
    Ember.onLoad('Ember.Application', function(Application) {
    
        Application.initializer({
            name: "store",
    
            initialize: function(container, application) {
                application.register('store:main', App.BreezeStore);
            }
        });
    
        Application.initializer({
            name: "injectStore",
            before: "store",
    
            initialize: function(container, application) {
                application.inject('controller', 'store', 'store:main');
                application.inject('route', 'store', 'store:main');
            }
        });
    
    });
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   GJK    10 年前

    Ember的容器是这样设计的,所以您实际上只需要将Ember子类注册为工厂。但如果你不介意一点黑客,有一种方法可以实现你想要的。您只需要创建一个伪工厂,该工厂将在容器调用时为其提供所需的对象 create .

    initialize: function(container, application) {
        var factory = {
            create: function() {
                return App.BreezeStore.create().instance;
            }
        };
    
        application.register('store:main', factory);
    }
    

    因此,当容器实例化单例存储时,它将调用 创造 在你的假工厂 instance 上面的变量。所以现在你的 store:main value将是您期望的值。

    但作为一个陷阱,这意味着您将无法访问您在 BreezeStore 但我想你不会那样做。如果您需要能够访问这些存储,您可以始终注册并注入两个不同的存储。