2016-06-25 8 views
0

Ich schrieb eine kleine Angular1 App, die einen Datenbankdienst hat, der LokiJS verwendet. Ich frage mich, ob es eine Möglichkeit gibt, Eigenschaften/Funktionen dynamisch zu einem Service/Factory hinzuzufügen.Dynamische Hinzufügen von Eigenschaften/Funktionen zu einem Service/Fabrik

Ich versuche dynamische Getter für jede Sammlung hinzuzufügen, die über diesen Dienst erstellt wird.

Hier mein Beispiel:

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

     }]);; 

Gibt es eine Möglichkeit, eine initialisierte Service/Fabrik zu ändern?

+2

Die Frage erklärt nicht, warum 'this ['get' + name] = this.getCollection.bind (this, name)' nicht funktioniert. Wenn der 'addCollection'-Aufruf vor 'get *' steht, sollte es funktionieren. – estus

+1

Ihr Code sollte gut funktionieren. Haben Sie einen Fehler? – dfsq

+0

Sorry Frage war unnötig ... Alles ist in Ordnung mit diesem ['Get' + Name] = this.getCollection.bind (this, name) – kerosene

Antwort

1

Die am besten geeignete Ort dafür ist Dekorateur

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

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

      ... 

      return Database; 
    }]); 

Das Rezept unterscheidet sich von run Block nicht wirklich, aber es garantiert wird, dass der Service auf Injektion initialisiert werden, während run Blöcke auf deren Reihenfolge ab.