2014-09-22 11 views
12

Nowy zastrzyk zależności, o którym Volta mówił w witrynie ng-conf i jest zawarty tutaj: https://github.com/angular/di.js jest właśnie tym, czego szukam w moim projekcie AngularJS 1.3.0.Czy mogę użyć angular/di.js z projektem AngulrJS 1.3.0?

Problem polega na tym, że nie jest dla mnie jasne, czy mogę z niego korzystać. Wydaje się, że nie ma przykładu użycia go w AngularJS v1 w przykładach projektów Github.

natknąłem się na przykład stosując go w projekcie Backbone: http://teropa.info/blog/2014/03/18/using-angular-2-0-dependency-injection-in-a-backbone-app.html i znalazłem przykład użycia ES6 w projekcie angularjs V1: https://github.com/mvolkmann/todo-es6/, ale nie mogę znaleźć przykład przy użyciu nowego DI w kątowym projektu v1 .

Jestem zdezorientowany. Jakieś wskazówki?

+0

Uważam, że nie jest to możliwe, ponieważ obecny wtryskiwacz jest ściśle sprzężony z rdzeniem kątowym, ale dobrze byłoby usłyszeć od ekspertów. – olanod

+0

Jaki jest twój przypadek użycia? Mam na myśli, jak i dlaczego chcesz go użyć? –

+1

Mam 2+ aplikacji z dużą liczbą współdzielonych modułów. Chciałbym móc budować każdą aplikację z jej modułu "root", wysysając tylko te moduły, których potrzebuje. Innym powodem jest to, że chciałbym zminimalizować przyszłe wysiłki migracyjne do Angular 2.0, więc chciałbym, aby wszystkie elementy 2.0 były dostępne teraz (di, router) do nowego rozwoju. – kpg

Odpowiedz

3

Może nie używać di.js ale zamiast transpile kod podobny stylem do poprawnej składni 1.x kątowej (podczas etapu budowy)

mały przykład i ewentualnego rozpoczęcia:

var falafel = require('falafel'); 
var traceur = require('traceur'); 

var src = 
    '@Inject(MyService,MyOtherService)' + 
    'class Thing{' + 
    ' constructor(service,otherservice){' + 
    ' }' + 
    '}'; 

src = traceur.compile(src, { annotations: true }); 
//console.log(src); 

function tryGetPath(obj, path) { 
    path.split('.').forEach(function(key) { 
    obj = obj && obj[key]; 
    }); 
    return obj; 
} 

var output = falafel(src, function(node) { 
    //find `Object.defineProperty for 'annotations'` 
    if (node.type === 'CallExpression' && tryGetPath(node, 'arguments.1.value') === 'annotations') { 
    var injectable = tryGetPath(node, 'arguments.0.name'); 
    var $inject = (tryGetPath(node, 'arguments.2.properties.0.value.body.body.0.argument.elements') || []) 
         .filter(function(a){return a.callee.name === 'Inject'}) 
         .reduce(function(p,c){ p.push.apply(p,c.arguments); return p;},[]) 
         .map(function(a){return "'"+a.name+"'";}); 
    node.update(injectable + '.$inject = [' + $inject.toString() + '];'); 
    } 
}); 

console.log(output); 

Być może możesz nawet użyć pewnych atrybutów (np. @NgController itd.), Aby zarejestrować go w swoim module jako kontroler.

Powiązane problemy