2016-06-25 6 views
0

LokiJSを使用しているデータベースサービスを持つ小さなAngular1アプリを作成しました。 プロパティ/関数をサービス/ファクトリに動的に追加する方法があるのだろうかと思っていました。プロパティ/機能をサービス/工場に動的に追加する

私は、このサービスを通じて作成されたすべてのコレクションに対して動的getterを追加しようとしています。

ここに私の例:

Database.js

angular.module('MyApp') 
    .factory('Database', ['$log', '$q', 'Loki', 

     function Database($log, $q, Loki) 
     { 
     var _db, 
      dbInitialized = false; 

     function init(config) 
     { 
      // some logic here 
     } 

     function addCollection(name, cfg) { 
      // some logic here 

      _db.addCollection(name, cfg); 

      // this doesnt work, but is desired -> 
      /*this['get'+name] = this.getCollection.bind(this, name);*/ 

     } 

     function getCollection(collectionName) { 
      // some logic here 
      return something; 
     } 

     return { 
      init: init, 
      addCollection: addCollection, 
      getCollection: getCollection 
     }; 
     } 
    ] 
); 

app.js

angular 
    .module('MyApp', ['lokijs']) 
     .run(['Database', 
     function (Database) { 

       Database.init(); 

       Database.addCollection("MyCollection", {}); 

       // then fill collection, afterwards -> 
       var collection = Database.getCollection("MyCollection"); 
       // I would like to use Database.getMyCollection() 

     }]);; 

は初期化サービス/ファクトリーを変更する方法はありますか?

+2

なぜ、this ['get' + name] = this.getCollection.bind(this、name) 'が機能しないのかという質問は説明しません。 'addCollection'呼び出しが' get * 'に先行するなら、それはうまくいくはずです。 – estus

+1

あなたのコードは正常に動作するはずです。何かエラーが出ますか? – dfsq

+0

申し訳ありません質問は不必要でした...すべてがこの[get '+ name] = this.getCollection.bind(this、name) – kerosene

答えて

1

そのための最も適切な場所はデコレータ

app.decorator('Database', ['$delegate', function ($delegate) { 
      var Database = $delegate; 
      Database.init(); 

      Database.addCollection("MyCollection", {}); 

      ... 

      return Database; 
    }]); 

あるレシピは本当にrunブロックと異なっていませんが、それはrunブロックは、その順序に依存しながらサービスは、注射時に初期化されることを保証します。

関連する問題