2013-03-07 22 views
21

Örnek:AngularJS - DI sistemi argümanların ismini nasıl biliyor? Düz resmi sitesinden

function PhoneListCtrl ($scope, $http) { 
    $http.get('phones/phones.json').success(function(data) { 
     $scope.phones = data; 
    }); 

    $scope.orderProp = 'age'; 
} 

$scope ve $http argümanları DI sistem içindeki karşılık gelen angularjs hizmetleri bulmak için benzersiz tanımlayıcılardır. Öyleyse, DI sistemi tam olarak bu argümanların değişken ismini nasıl alır? kaynak @GitHub den

cevap

31

Bu şekilde azaltılmakta versiyonu

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 
    if (!($inject = fn.$inject)) { 
     $inject = []; 
     fnText = fn.toString().replace(STRIP_COMMENTS, ''); 
     argDecl = fnText.match(FN_ARGS); 
     angular.forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ 
      arg.replace(FN_ARG, function(all, underscore, name){ 
       $inject.push(name); 
      }); 
     }); 
     fn.$inject = $inject; 
    } 

    return fn.$inject; 
} 

Demo: Fiddle (Konsola bakınız);

Adımlar: işlevinde toString çağrılması
1. regex
3. Ekstresi kullanılarak fonksiyon source
2. Sürücülerden tüm yorumları döndüren bir kaynaktan argümanlar regex

kullanarak
9

Düz:

basit bir şekilde fonksiyonu argümanları bağımlılıklar elde etmektir. Bu işlevi toString() yöntemini kullanarak ve argüman adlarını ayıklayarak bir dizeye dönüştürerek yapılır.

// Given 
function MyController($scope, $route) { 
    // ... 
} 
// Then 
expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); 

ve Açıklama fonksiyonu satırda 45 görüldüğü gibi

function annotate(fn) { 
    var $inject, 
    fnText, 
    argDecl, 
    last; 

    if (typeof fn == 'function') { 
    if (!($inject = fn.$inject)) { 
     $inject = []; 
     fnText = fn.toString().replace(STRIP_COMMENTS, ''); 
     argDecl = fnText.match(FN_ARGS); 
     forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ 
     arg.replace(FN_ARG, function(all, underscore, name){ 
     $inject.push(name); 
     }); 
    }); 
    fn.$inject = $inject; 
    } 
    } else if (isArray(fn)) { 
    last = fn.length - 1; 
    assertArgFn(fn[last], 'fn') 
    $inject = fn.slice(0, last); 
    } else { 
    assertArgFn(fn, 'fn', true); 
    } 
    return $inject; 
} 

ve üstü