控制器将第二个参数作为匿名函数。
我有两个控制器示例,一个使用匿名函数作为参数 nothing ,第二个使用$scope
对象。
如何在幕后制作""可以检测到我的匿名函数是否有参数?我怎样才能在自定义js方法中模仿它?
controller('ctrl',function(){
console.log( arguments[0] ); // ->> undefined
});
vs
controller('ctrl',function($scope){
console.log( arguments[0] ); // ->> js object
});
我想的伪代码是这样的:
( if F has parameters ) F.bind($scope) // or F.call(....)
答案 0 :(得分:3)
记录在案Here
Angular将使用指定的实例化一个新的Controller对象 Controller的构造函数。将创建一个新的子范围 并作为可注射参数提供给控制器 构造函数作为$ scope。
因此,传递给Controller的构造函数的第一个参数是子作用域实例$ scope。
由于arguments
对象是与传递给函数的参数对应的类数组对象,因此打印参数[0]将打印第一个传递的参数(即$ scope)。
答案 1 :(得分:2)
这是角度的依赖注入的工作方式:它查看args名称,然后查找它以了解要注入的内容。
您可以在此处找到相应的具体代码:
https://github.com/angular/angular.js/blob/master/src/auto/injector.js#L72
答案 2 :(得分:1)
Angular从三个地方之一获取要注入的对象的名称(仅使用存在的第一个):
$inject
属性toString()
并从中提取名称来检查函数实际期望的参数。一旦它有一个名称列表,注入器将首先在映射对象中找到对象,该对象可以传递给注入器,然后传递到已在可用角度模块中注册的对象中。再次使用第一个匹配对象,因此调用控制器的代码将唯一的$scope
对象传递给每个控制器的注入器,但是您可以使用的大多数其他名称(如服务)是单例,并且每个名称都重用相同的对象。时间。
您可以自己使用注射器:
var injector = angular.injector();
function MyFunction(something) { ... }
injector.invoke(MyFunction, this, { something: anObject });
请参阅https://docs.angularjs.org/api/auto/service/ $ injector