如果我没有指定字符串,Angular如何知道要注入什么?

时间:2014-10-27 02:01:39

标签: javascript angularjs language-implementation

考虑以下代码:

angular.module('app', [])
  .controller('MainCtrl', function ($scope) {
    ...
  });

我知道为了避免JS缩小时的注入问题,应该使用依赖注入的数组形式:

angular.module('app', [])
  .controller('MainCtrl', ['$scope', function ($scope) {
    ...
  }]);

但Angular如何知道第一个案例(非数组)注入的内容?如果我使用.controller('MainCtrl', function (scop)代替$scope怎么办?它解析我的JS并查找与其某些提供者匹配的函数参数名吗?

1 个答案:

答案 0 :(得分:4)

请注意,controller的函数是函数controller的参数。这允许Angular在变量中获取该函数并分析其参数,并使用该角度列出需要注入的服务。

在下面的代码中,您可以看到Angular在幕后的作用,以便匹配这些参数:

var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;

function annotate (fn) {
  var $inject = [];
  fn = fn.toString();
  var first = fn.replace(STRIP_COMMENTS, '');
  var second = first.match(FN_ARGS)[1];
  var third = second.split(FN_ARG_SPLIT);
  third.forEach(function (arg) {
    arg.replace(FN_ARG, function (all, underscore, name) {
      $inject.push(name);
    });
  });
  return $inject;
}