【问题标题】:AngularJS controllers created with "new" or notAngularJS 控制器是否使用“新”创建
【发布时间】:2013-06-08 01:31:38
【问题描述】:

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

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

【问题讨论】:

  • 我对 angular 不是很熟悉,但它 看起来 就像 as 只是一个别名。为什么as 在你看来与new 有任何关系?
  • 这个问题和angularjs-directive有关系吗?
  • 因为在 DemoController() 的定义中,有一个 "this.students = [...]" 这意味着 demo 是引用 "this" 的对象,如果我们这样做,就会发生这种情况"demo = new DemoController()"
  • 您的DemoController as demo 示例来自哪里?角 1.2。距离还很远(1.1.5 仍在不稳定的分支中)但我怀疑他们是否会更改控制器以使用new 进行实例化,这将是一个非常大的变化。我会使用文档中的“Angular 从不创建控制器的实例”语句。
  • 我刚刚从 angularjs 频道观看了 YouTube 上的“1.5 版中的新功能”。

标签: javascript angularjs angularjs-controller angularjs-injector angularjs-controlleras


【解决方案1】:

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

Here is a link 到更改相关代码的 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 关键字is 确实被调用了,但它是在一个名为Constructor 的空泛型函数上调用的,而不是控制器构造函数。首先将空构造函数的原型设置为传递给注入器的 Angular Type 的原型。

【讨论】:

  • 但是,例如,在 $resource 的 Angular API 页面上,他们的示例 (script.js) 包含以下代码: BuzzController.prototype = { ... } 这看起来像控制器与“new”关键字一起使用。 docs.angularjs.org/api/ngResource.$resource
  • 看看我的编辑,也许它会让问题更清楚一点。
猜你喜欢
  • 2010-10-30
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多