是否使用“ new”创建的AngularJS控制器

问题描述 投票:1回答:1

我一直在看到有关自定义控制器是使用“ 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关键字实例化控制器。

是哪个?有人可以澄清吗?

javascript angularjs angularjs-controller angularjs-injector angularjs-controlleras
1个回答
1
投票

“ as”语法只是一个别名,并且文档是正确的,即Angular永远不会通过在控制器构造函数上调用new运算符来创建控制器类型的实例。具有别名的新行为是,现在$ControllerProvideras关键字的存在进行了正则表达式测试,并且如果存在,则将对控制器的引用存储在别名下的本地范围内。

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的原型。

© www.soinside.com 2019 - 2024. All rights reserved.