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关键字进行实例化。

哪一个?有人可以澄清一下吗?

4

1 回答 1

1

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

这是更改相关代码的 git 功能提交的链接。


另外:来自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关键字确实被调用了,但它是在一个名为 的空泛型函数上调用的Constructor,而不是控制器构造函数。首先将空构造函数的原型设置Type为传递给注入器的 Angular 的原型。

于 2013-06-12T04:11:36.197 回答