【问题标题】:Can I use angular/di.js with an AngulrJS 1.3.0 project?我可以在 AngulrJS 1.3.0 项目中使用 angular/di.js 吗?
【发布时间】:2014-09-22 12:55:52
【问题描述】:

Volta 在 ng-conf 中谈到的新依赖注入,包含在此处:https://github.com/angular/di.js 正是我正在为我的 AngularJS 1.3.0 项目寻找的。​​p>

问题是,我不清楚我是否可以使用它。 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 项目。

我很困惑。有什么指点吗?

【问题讨论】:

  • 我认为这是不可能的,因为目前的喷油器与角芯紧密耦合,但很高兴听到专家的意见。
  • 您的用例是什么?我的意思是你要如何以及为什么要使用它?
  • 我有 2 个以上的应用程序,其中包含大量共享模块。我希望能够从它的“根”模块构建每个应用程序,只吸收它需要的那些模块。另一个原因是我希望尽量减少未来向 Angular 2.0 的迁移工作,因此理想情况下希望使用现在可用的任何 2.0 组件(di、路由器)进行新开发。
  • 当您尝试将 Angular 1 编码为 Angular 2 时,噩梦就来了。这是 2 种不同的框架,有 2 种不同的方法。我喜欢享受这个过程。所以我根据 1.3 风格开发我的 ng1 应用程序,我很高兴。就像耶稣说的,让明天为自己担心。 ng2 就是明天。

标签: angularjs ecmascript-6


【解决方案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 等)在您的模块上将其注册为控制器。

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 2019-02-21
    • 1970-01-01
    • 2013-08-07
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2019-09-25
    相关资源
    最近更新 更多