2014-03-01 73 views
1

我正在嘗試向我的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

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類上定義的任何屬性或方法,但我假設你沒有這樣做。如果您需要訪問這些內容,您可以隨時註冊並注入兩個不同的商店。

相關問題