2014-10-27 27 views
3

考慮以下代碼:如果我不指定字符串,Angular如何知道要注入什麼?

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

我知道,以避免注射的問題時,JS已經過壓縮,應使用依賴注入的陣列形式:

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

但如何角知道第一個大小寫(非數組)要注入什麼?如果我使用.controller('MainCtrl', function (scop)而不是$scope,該怎麼辦?它解析我的JS並查找匹配其某些提供者的函數參數名稱嗎?

回答

4

請注意,controller的功能是功能controller的參數。這允許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; 
} 
+1

這是正確的。他們接受函數,將其變成一個字符串,並查看依賴關係。然後將其匹配到應用程序中的服務/工廠模塊。由於依賴關係被重命名爲單個字母,因此它會縮小規模,並且無法映射到相應的應用程序模塊。 – 2014-10-27 02:20:16

+1

'fn = fn.toString();'←this。 – 2014-10-27 02:22:34

+0

@ZackArgyle如果你使用ng-annotate(例如,通過grunt-ng-annotate,ngannotate-rails等),你可以忽略字符串列表和* not * break minification。 – 2015-01-17 00:47:57

相關問題