2014-08-29 122 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)。哈哈!