2014-08-29 153 views
3

最近我一直在做一些角度的工作,並且我注意到可以省略控制器函數中依賴項的名稱數組。如果你這樣做,控制器仍然可以正常工作,並且依賴性被注入得很好。角度和控制器功能參數

我確定我錯過了一些東西。這些名字的原因是什麼?

回答

5

見第一個在https://docs.angularjs.org/tutorial/step_05

它是用來minifications後,讓您的依賴注射的字符串參考「上微小注意」:

由於角從名稱推斷控制器的依賴 參數給控制器的構造函數,如果你想要 縮小PhoneListCtrl控制器的JavaScript代碼,所有的 函數參數也會被縮小,並且依賴關係 注入器會n無法正確識別服務。

+0

哈!我知道我錯過了一些東西。這是否也意味着我不應該在自己的陣列中列出自己的工廠?因爲他們的名字將會改變。 – Omar 2014-08-29 14:38:32

+1

我可以添加,你應該:1)總是使用這個雙重符號或2)使用一個工具,自動爲你添加它像https://github.com/alexgorbatchev/grunt-angular-injector,因爲你一定會需要minifuication在某一點;) – 2014-08-29 14:41:29

+1

@CarlosBlanco要回答你的問題:是的,你muwt使用雙重符號的角核心依賴或你的。縮小後,變量名稱將被縮小,但由於「字符串」符號,它將指向良好的依賴關係 – 2014-09-01 07:05:41

1

控制器是可調用的,它們的參數必須注入現有/有效/註冊的依賴關係。角採取三種方式:

  1. 如果通過控制器(這也適用於供應商)是一個數組,最後一個項目是控制器,前者的項目預計將與依賴注入名稱的字符串。名字數和名字必須匹配。

    //parameter names are what I want. 
    c = mymodule.controller('MyController', ['$scope', '$http', function($s, $h) {}]); 
    
  2. 否則,如果通過控制器具有$inject性質,預期這樣的屬性是一個字符串作爲依賴關係的名稱的數組。數組的長度和長度必須匹配。

    con = function($s, $h) {}; 
    con.$inject = ['$scope', '$http']; 
    c = mymodule.controller('MyController', conn); 
    
  3. 否則,名字注入的陣列從參數列表中獲取,所以他們必須相應命名。

    c = mymodule.controller('MyController', function($scope, $http) {}); 
    //one type, one minification, and you're screwed 
    

你應該從未想到的是,控制器工作,如果你不明確設置-explicitly-的依賴關係的名字注入。這是一個不好的實踐因爲:

  1. 參數名稱變化,如果您壓縮(和你 - 一些day-縮小你的腳本)。
  2. 您的參數名稱中存在拼寫錯誤,您將需要幾個小時來查找錯誤。

意見建議:總是使用明確的符號(方式1或2)。哈哈!