2015-03-12 20 views
14

Kontekst, obecna implementacja klas/modułów w naszej aplikacji to common.js i klasy CoffeeScript. Desperacko szukam rozwiązania do pracy z ES6 lub TypeScript, ale problem pozostaje.Angular.js DI z klasami (ES6) i dziedziczeniem

Jak wykonać DI z dziedziczeniem klas za pomocą Angular-1.x?

względu na kod:

// SuperService.js 
class SuperService { 
    constructor($http, $q, $etc) { 
    // Implementation is not important ... 
    } 
} 
export { SubService } 

// SubService.js 
import { SuperService } from './SuperService'; 
class SubService extends SuperService { 
    constructor($more, $di, $things, $here) { 
    // Implementation is not important ... 
    // // // // // // // // // // 
    // Problem exists here ... // 
    // // // // // // // // // // 
    super($we, $need, $all, $the, $super, \ 
      $class, $di, $things, $every, $time, $we, \ 
      $inherit, $from, $it) 
    } 
} 
export { SubService } 

Trzeba w SubService tutaj przedefiniować wszystkie wymagania rodzic DI, aby skutecznie wywołać super()?

Jesteśmy obecnie robi coś podobnego do następującego:

// CoffeeScript        // Javascript 
app.factory "subService", (Service) ->  app.factory("subService", function(Service) { 
    SubService =() ->       var SubService; 
    Service.call(@)       SubService = function() { 
    @           Service.call(this); 
               return this; 
    # Overwrite some stuff on the "Service"  }; 
    Service::basepath = "/environments"   Service.prototype.basepath = "/environments"; 
    Service::model = Environment     Service.prototype.model = Environment; 
               return new SubService(); 
    new SubService()       }); 

który jest również mniej niż idealne, poza tym, że brzydkie.

+0

Czy kiedykolwiek znaleźć rozwiązanie to? Zbliżamy się do tego w podobny sposób, ale musi być lepszy sposób. – forrestranger

+1

Dokładnie z tego powodu, mój zespół nie przeszedł jeszcze na ES6 dla naszych kanciastych rzeczy, mamy nadzieję, że zostanie to w jakiś sposób rozwiązane w ruchu maszynopisującym w ng-2.0, ale nie widzimy niczego, co rozwiązałoby to jeszcze. –

+0

Podobnie jak w większości innych miejsc, w AngularJS myślę, że jest łatwiejsze i bardziej czytelne w użyciu kompozycji niż w dziedziczeniu. – Thomas

Odpowiedz

2

to nie ES6 (to ES7), ale to tylko może unosić łódź

Chciałbym spojrzeć na angular-decorators przez MikeRyan52.

On ułożyła @inject dekorator, który działa w następujący sposób:

@inject('$http', '$rootScope') 
class SomeClass { 
    constructor($http, $rootScope) { 

    } 
} 

@inject('$q') 
class SubClass extends SomeClass { 
    constructor($q, ...parentDependencies) { /** parent dependencies caught with a rest parameter **/ 
    super(...parentDependencies); 
    } 
} 

the implementation of @inject

+0

Świetnie, dzięki za tę wskazówkę, myślę, że po rozpoczęciu przenoszenia funkcji kątowych2 z powrotem na kanciaste, może lepiej zainwestować czas na ulepszenie :), ale wciąż niesamowite, zobaczyć dowód koncepcji i mieć wybór. –

0

dodać ten na samym dole SubService.js

SubService.$inject = ['$http', '$q', '$etc', '$more', '$di', '$things', '$here'];