我正在尝试在我的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');
}
});
});
答案 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
类上定义的任何属性或方法,但我认为您无论如何都没有这样做。如果您需要能够访问这些,您可以随时注册并注入两个不同的商店。