3

次のコードを検討してください。

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

JS が縮小されているときの注入の問題を回避するには、依存性注入の配列形式を使用する必要があることを知っています。

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

しかし、Angular は最初のケース (非配列) で何を注入するかをどのように知るのでしょうか? .controller('MainCtrl', function (scop)の代わりに使用するとどうなり$scopeますか? JS を解析して、そのプロバイダーの一部と一致する関数パラメーター名を探しますか?

4

1 に答える 1

4

controllerの関数は関数のパラメータであることに注意してくださいcontroller。これにより、Angular はその関数を変数で取得し、そのパラメーターを分析できます。その 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;
}
于 2014-10-27T02:09:08.677 に答える