2013-08-21 25 views
0

通過文檔閱讀,並與玩的jsfiddle,我注意到在以下幾個方面*被定義控制器(和工作):定義基本AngularJS控制器與服務

function InvoiceCntl($scope) {...} 
function Ctrl2($scope, $timeout) {...} 
function countController1($scope, $http, $timeout) {...} 
function countController2($scope, $timeout, $http) {...} 

我的問題是有關的部分調用我的控制器的AngularJS庫:它如何知道我期望的服務以及我的控制器期望它們的順序?

這是JavaScript,Jim,但不是我們所知道的。

*bearing in mind that controllers shouldn't be defined in the global scope

回答

1

Angular's dev guide

如何注射器知道需要注入什麼樣的服務?

(...)

推斷依賴

得到 依賴性保持最簡單的方法,就是假設函數參數名的依賴關係的 名。

功能myController的($範圍,迎賓員){...}

給出一個函數 噴油器可以推斷出該服務的名稱通過檢查 函數聲明和提取參數名稱注入。在上面的 例子中$ scope和greeter是需要注入 到這個函數中的兩個服務。

當代碼需要縮小時,這並不是真的。檢查開發指南(上面的鏈接)中的「$註釋註釋」部分以更好地理解它。

+0

謝謝。我跟着你的鏈接,然後一個更多,最終結束了_ [這裏](https://github.com/angular/angular.js/blob/master/src/auto/injector.js)_,在那裏我發現了魔法。它將該函數轉換爲一個字符串,然後將這些參數重新格式化。 – aidan

0

控制器不指望它們按任何順序!他們只能用名稱來標識它們可以以任何順序的服務。然而

// Old way to define your controller 
angular.module('yourModule') 
    .controller('yourController', function($scope, $http, yourService){ 

     // Your code here 

    }); 

,因爲這是:

1

默認情況下,AngularJS噴油器服務將匹配的控制器功能的參數名稱對內置AngularJS服務(從$號)的名字簡單地基於字符串比較,當代碼被簡化和/或縮小時,這會導致問題。

因此,建議您使用用於使用所述陣列符號這樣創建的控制器的較新的語法:

// Newer, better way to define your controller 
angular.module('yourModule') 
    .controller('yourController', ['$scope', '$http', 'yourService', function($scope, $http, yourService){ 

     // Your code here 

    }]); 

注意,控制器功能通過由要注入服務的陣列替換並以控制器功能結束。

['yourService', 'yourOtherService', function(yourService, yourOtherService){ 

    // You can use yourService and yourOtherService here 
}] 

的名稱沒有對應,所以你可以使用:

['$http', '$scope', function(h, s){ 

    // You can use h and s here 
    // h will be the $http service, s will be the $scope 
}] 

AngularJS現在的順序注射服務,您的數組像這樣的規定他們強烈建議使用較新的數組表示法,因爲它可以保證您的代碼在縮小或醜化後仍然可以工作。

希望有幫助!