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

时间:2014-03-01 05:26:10

标签: ember.js breeze

我正在尝试在我的ember项目中添加一个简单的breeze.js数据存储区,我想在今天注册类似于ember-data的东西。到目前为止,我有一个工作示例,我唯一的问题是我需要手动在我的商店中设置“实例”,然后像这样引用它

  

“this.store.instance.something()”

而不是我喜欢的

  

“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 个答案:

答案 0 :(得分:1)

Ember的容器设计是为了让你真的只能将Ember子类注册为工厂。但如果你不介意一点黑客,有办法实现你想要的。您只需要创建一个假工厂,它将为容器提供您希望它在调用create时拥有的对象。

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

    application.register('store:main', factory);
}

因此,当容器实例化单件商店时,它会在您的假工厂上调用create,它将从上方返回instance变量。现在,您的store:main值将是您期望的值。

但是作为一个陷阱,这意味着您将无法访问您在BreezeStore类上定义的任何属性或方法,但我认为您无论如何都没有这样做。如果您需要能够访问这些,您可以随时注册并注入两个不同的商店。