动态地向服务/工厂添加属性/功能

时间:2016-06-25 18:15:42

标签: javascript angularjs angular-services lokijs

我写了一个小的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()

        }]);;

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

1 个答案:

答案 0 :(得分:1)

最适合的地方是装饰师

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

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

            ...

            return Database;
    }]);

配方与run块没有什么不同,但它保证服务将在注入时初始化,而run块依赖于它们的顺序。