2016-06-03 14 views
0

Ich habe das folgende Modul:Inheritance in Dienstleistungen

angular.module('project.itemServices', ['project.cacheFactory', 'project.dataProvider']) 

.run(function() { 
     ISvc = new function() { 
      this.endpoint = ''; 
      this.name = 'foo'; 
      this.items = {}; 
      this.clean = function() { 
       cacheFactory.clear(this.name); 
       items = {}; 
      }; 
      this._store = null; 
      this.populate = function() { 
       cacheFactory.look('fetch', this.endpoint, this.name).then(function (data) { 
        this._store(data); 
       }) 
      }; 
     }; 
    } 
) 

.service('catListSvc', function() 
{ 
    this.prototype = ISvc.prototype; 
}) 

.run(function(catListSvc) 
{ 
    console.log(catListSvc.name); 
}); 

ich alle meine Dienste in diesem Modul wollen vom ISvc Objekt erben, und dann setzen sie eigene _store Methode ist dieser Service für den Austausch von Daten vorgesehen ist zwischen Controller.

Ich weiß nicht, wie dies zu tun ist, wenn Sie versuchen, console.log(catListSvc.name), undefined kommt auf.

Ich habe mehrere Dinge ausprobiert, z. Objects.create(ISvc.prototype), funktioniert aber nicht.

Irgendeine Idee, wie man das erreicht?

+0

'this.prototype' tut nichts. Um die Vererbung einzurichten, müssen Sie die "Prototyp" -Eigenschaft des Konstruktors auf ein Objekt setzen, das an den Prototyp gebunden ist, den Sie erben möchten. –

+0

Könnten Sie bitte ein Beispiel schreiben? Ich bin verwirrt. –

+0

Leider kann ich nicht, Winkel 1 ist nicht mein Ding, ich erkläre nur, wo dein Hauptproblem liegt. Siehe http://blog.mgechev.com/2013/12/18/inheritance-services-controllers-in-angularjs/ –

Antwort

1

Das Grundmuster für Service-Erbe, das erfordert nur über mehrere JS-Dateien verteilt werden kann Angular DI ist

// service is PascalCased and returns a constructor 
function BaseProjectService(...deps...) { ... } 

app.value('BaseProjectService', BaseProjectService); 

// service is camelCased and returns an instance 
app.factory('someProjectService', ['BaseProjectService', ...deps..., function (BaseProjectService, ...deps...) { 
    function SomeProjectService(...deps...) { 
    // is a super constuctor, since SomeProjectService has got no own prototype 
    this.constructor(...deps); 
    ... 
    } 
    SomeProjectService.prototype = BaseProjectService.prototype; 
    return new SomeProjectService(...deps...); 
}]); 

Der Nachteil dieser Fabrik Funktionen und nicht die Klassen für deps Annotation und Injektion verantwortlich sind, führt dies zu WET-Code

Dieses Muster kann später komplizierter werden, wenn die Kinderbetreuungsdienste ihre eigenen Prototypen benötigen. Hier sollten die ES6-Klassen berücksichtigt werden.