我一直在看到有关自定义控制器是使用“ new”关键字实例化还是仅应用于$ scope对象的相互矛盾的信息。
文档站点说,
Angular(在JavaScript的Function#apply意义上)将控制器构造函数应用于新的Angular作用域对象,该对象设置了初始作用域状态。这意味着Angular永远不会创建控制器类型的实例(通过在控制器构造函数上调用new运算符)。构造函数始终应用于现有的范围对象。
但是似乎在Angular 1.2中,有一个"as"
构造会将控制器重命名为其他名称,如:
<body ng-controller="DemoController as demo">
<tr ng-repeat="student in demo.students">
<td>{{student.name}}</td>
</tr>
</body>
function DemoController() {
this.students = [...]
}
因此,看起来好像正在使用new
关键字实例化控制器。
是哪个?有人可以澄清吗?
“ as”语法只是一个别名,并且文档是正确的,即Angular永远不会通过在控制器构造函数上调用new运算符来创建控制器类型的实例。具有别名的新行为是,现在$ControllerProvider
对as
关键字的存在进行了正则表达式测试,并且如果存在,则将对控制器的引用存储在别名下的本地范围内。
Here is a link更改了相关代码的git功能提交。
Also:从Angular源(1.1.5),这是$ControllerProvider
中创建控制器的代码:
instance = $injector.instantiate(expression, locals);
这里是instantiate
方法:
function instantiate(Type, locals) {
var Constructor = function() {},
instance, returnedValue;
// Check if Type is annotated and use just the given function at n-1 as parameter
// e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);
Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;
instance = new Constructor();
returnedValue = invoke(Type, instance, locals);
return isObject(returnedValue) ? returnedValue : instance;
}
因此,您可以看到new
关键字is确实已被调用,但是它是在一个称为Constructor
的空泛型函数而不是控制器构造函数上被调用的。首先,将空构造函数的原型设置为传递到注入器的Angular Type
的原型。