2016-06-25 2 views
0

Я написал небольшое приложение Angular1, в котором есть служба базы данных, использующая LokiJS. Мне было интересно, есть ли способ динамически добавлять свойства/функции в Service/Factory.Динамически добавлять свойства/функции к сервису/фабрике

Я пытаюсь добавить динамический геттер для каждой коллекции, созданной с помощью этой службы.

Вот мой пример:

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() 

     }]);; 

Есть ли способ, чтобы изменить инициализированную Service/Factory?

+2

Вопрос не объясняет, почему 'this ['get' + name] = this.getCollection.bind (this, name)' не работает. Если вызов 'addCollection' предшествует' get * ', он должен работать. – estus

+1

Ваш код должен работать нормально. Вы получаете какую-либо ошибку? – dfsq

+0

Извините, вопрос не нужен ... Все в порядке с этим ['get' + name] = this.getCollection.bind (это, имя) – kerosene

ответ

1

Наиболее подходящее место для этого является декоратором

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

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

      ... 

      return Database; 
    }]); 

Рецепт не очень отличается от run блока, но это гарантирует, что услуга будет инициализирована на инъекции, в то время как run блоков зависят от их порядка.

Смежные вопросы