Могу ли я использовать angular/di.js с проектом AngulrJS 1.3.0?

Новая инъекция зависимостей, о которой говорил Вольта в ng-conf и содержится здесь: https://github.com/angular/di.js - это то, что я ищу мой проект AngularJS 1.3.0.

Проблема в том, что мне непонятно, могу ли я ее использовать. Кажется, что нет примера использования его для AngularJS v1 в примерах проекта github.

Я наткнулся на пример, используя его в проекте Backbone: http://teropa.info/blog/2014/03/18/using-angular-2-0-dependency-injection-in-a-backbone-app.html, и я нашел пример использования ES6 в проекте AngularJS v1: https://github.com/mvolkmann/todo-es6/, но я не могу найти пример с использованием нового DI в проекте Angular v1.

Я в замешательстве. Любые указатели?

Ответ 1

Может быть, не использовать di.js, а вместо этого перевести аналогичный код в действительный синтаксис angular 1.X(во время шага сборки)

Небольшой пример и возможный запуск:

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

Возможно, вы даже можете использовать определенные атрибуты (например, @NgController и т.д.), чтобы зарегистрировать его на своем модуле в качестве контроллера.