2014-09-22 9 views
12

La nuova iniezione di dipendenza di cui Volta ha parlato in ng-conf ed è qui contenuta: https://github.com/angular/di.js è proprio quello che sto cercando per il mio progetto AngularJS 1.3.0.Posso usare angular/di.js con un progetto di AngulrJS 1.3.0?

Il problema è che non mi è chiaro se posso usarlo o meno. Non sembra esserci un esempio di utilizzo per AngularJS v1 negli esempi di progetto github.

mi sono imbattuto in un esempio di utilizzarlo in un progetto di Backbone: http://teropa.info/blog/2014/03/18/using-angular-2-0-dependency-injection-in-a-backbone-app.html e ho trovato un esempio di utilizzo ES6 in un progetto AngularJS v1: https://github.com/mvolkmann/todo-es6/, ma non riesco a trovare un esempio utilizzando la nuova DI in un progetto v1 angolare .

Sono confuso. Qualche indicazione?

+0

Penso che non sia possibile poiché l'iniettore corrente è strettamente accoppiato con il nucleo angolare, ma sarebbe bello sentire gli esperti. – olanod

+0

Qual è il tuo caso d'uso? Intendo come e perché vuoi usarlo? –

+1

Ho 2 o più applicazioni con un gran numero di moduli condivisi. Mi piacerebbe essere in grado di costruire ogni applicazione dal suo modulo 'root', succhiando solo i moduli che richiede. L'altro motivo è che vorrei ridurre al minimo il futuro sforzo di migrazione verso Angular 2.0, quindi preferirei utilizzare qualsiasi componente 2.0 ora disponibile (di, router) per un nuovo sviluppo. – kpg

risposta

3

Forse non utilizzare di.js ma invece transpile codice simile stile nella sintassi 1.X angolare valido (nel corso di un passaggio di generazione)

Un piccolo esempio e di un possibile inizio:

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

Forse puoi persino usare determinati attributi (es. @NgController ecc.) Per registrarlo sul tuo modulo come controller.

Problemi correlati