Volta在ng-conf上谈到的新的依赖注入包含在这里:https://github.com/angular/di.js正是我正在寻找的AngularJS 1.3.0项目。
问题是,我不清楚我是否可以使用它。在github项目示例中,似乎没有将它用于AngularJS v1的示例。
我在Backbone项目中遇到了一个使用它的示例:http://teropa.info/blog/2014/03/18/using-angular-2-0-dependency-injection-in-a-backbone-app.html我找到了一个在AngularJS v1项目中使用ES6的示例:https://github.com/mvolkmann/todo-es6/,但我找不到示例在Angular v1项目中使用新的DI。
我很困惑。有什么指针吗?
答案 0 :(得分:3)
也许不要使用di.js,而是将类似风格的代码转换为有效的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
等)将其作为控制器注册到您的模块上。