将属性/功能动态添加到服务/工厂



我编写了一个小的angular1应用程序,该应用具有使用lokijs的数据库服务。我想知道是否有一种动态添加属性/功能到服务/工厂的方法。

我正在尝试为通过此服务创建的每个集合添加动态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()
        }]);;

有没有办法修改初始化服务/工厂?

最合适的地方是装饰

  app.decorator('Database', ['$delegate', function ($delegate) {
            var Database = $delegate;
            Database.init();
            Database.addCollection("MyCollection", {});
            ...
            return Database;
    }]);

该食谱与run块没有真正的不同,但是它可以保证在注入时初始化服务,而run块取决于其订单。

最新更新