2014-09-22 8 views
12

Die neue Abhängigkeitsinjektion, über die Volta bei ng-conf sprach und die hier enthalten ist: https://github.com/angular/di.js ist genau das, wonach ich für mein AngularJS 1.3.0-Projekt suche.Kann ich angular/di.js mit einem AngulrJS 1.3.0 Projekt verwenden?

Das Problem ist, es ist mir nicht klar, ob ich es benutzen kann oder nicht. Es scheint kein Beispiel dafür zu geben, AngularJS v1 in den github-Projektbeispielen zu verwenden.

stieß ich auf ein Beispiel in einem Backbone-Projekt mit: http://teropa.info/blog/2014/03/18/using-angular-2-0-dependency-injection-in-a-backbone-app.html und ich fand Projekt ein Beispiel für die Verwendung ES6 in einem AngularJS v1: https://github.com/mvolkmann/todo-es6/, aber ich kann ein Beispiel mit dem neuen DI in einem Winkel v1 Projekt nicht gefunden .

Ich bin verwirrt. Irgendwelche Zeiger?

+0

Ich denke, es ist nicht möglich, da der Strominjektor eng mit dem angularen Kern gekoppelt ist, aber es wäre nett, von den Experten zu hören. – olanod

+0

Was ist Ihr Anwendungsfall? Ich meine, wie und warum willst du es benutzen? –

+1

Ich habe 2 + Anwendungen mit einer großen Anzahl von geteilten Modulen. Ich würde gerne in der Lage sein, jede Anwendung von ihrem "Wurzel" -Modul zu bauen, indem sie nur die Module einsaugt, die sie benötigt. Der andere Grund ist, dass ich die zukünftigen Migrationsanstrengungen auf Angular 2.0 minimieren möchte, also idealerweise 2.0 Komponenten verwenden möchte, die jetzt verfügbar sind (di, router) für die Neuentwicklung. – kpg

Antwort

3

Vielleicht di.js nicht verwenden, sondern ähnlich gestylt Code in gültige Winkel 1.X Syntax transpile (während eines Build-Schritt)

Ein kleines Beispiel und einen möglichen Start:

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

Vielleicht können Sie sogar bestimmte Attribute verwenden (zB @NgController usw.), um sie als Controller auf Ihrem Modul zu registrieren.

Verwandte Themen