Angularjs“Controller as”或“$ scope”

我想知道angularjs中“Controller as”或“$ scope”语法的主要区别是什么。

  1. 他们是否有任何性能影响,如果是的话哪种语法更好。
  2. “Controller as”语法肯定会提高代码的可读性,因为Knockout.js和其他JavaScript框架遵循相同的语法。
  3. $范围将提供范围inheritance,有时会给我们这种奇怪的行为

    <div ng-controller="firstController"> ParentController: <input type="text" ng-model="parent"/> <div ng-controller="secondController"> ChildController: <input type="text" ng-model="parent" /> </div> </div> app.controller('ParentController', function ($scope) { $scope.parent = "parentScope"; }).controller('ChildController', function ($scope) { /*empty*/ }); 

    a)最初孩子会得到父母的财产,并且当我们更新父母孩子时也显示“parentScope”也会得到更新。 但是,如果我们更改了子属性,则更新父项时不会修改子项,因为它具有自己的范围属性。

    b)如果我正在使用控制器作为语法改变的孩子也更新父。

过去我已经写了几个这个问题的答案,他们基本上都是同样的东西。 在Angular中,即使没有明确地引用它,也使用$scope

ControllerAs语法允许Angular帮助您编写更高效的容错控制器。 在幕后,当你使用ng-controller="theController as ctrl" ,Angular将创buildtheController作为$scope一个属性并将其赋值为ctrl 。 您现在有一个从范围引用的对象属性,并自动保护原型inheritance问题。

从性能angular度来看,由于您仍在使用$scope ,所以应该没有什么性能差异。 但是,由于你的控制器现在没有将variables直接分配给$scope ,所以它不需要注入$scope 。 而且,控制器可以更简单地单独进行testing,因为它现在只是一个普通的JavaScript函数。

从前瞻性的angular度来看,Angular 2.0不会有$scope ,而是会使用ECMAScript 6的特性。在Angular团队发布的任何显示迁移的预览中,他们首先通过重构控制器来消除$scope 。 如果你的代码没有使用基于$scope的控制器,那么你的第一步迁移就已经完成了。

从devise者的angular度来看,ControllerAs语法使对象被操纵的地方更清晰。 通过使用customerCtrl.AddressstoreCtrl.Address ,可以更容易地识别出您拥有由多个不同控制器分配的地址,而不是同时使用$scope.Address 。 在一个页面上有两个不同的HTML元素,这两个HTML元素都绑定到{{Address}}并知道哪一个元素只包含在控制器中,这是解决问题的一大麻烦。

最后,除非你正在试图做一个10分钟的演示,否则你真的应该使用ControllerAs来处理任何严重的Angular工作。

我肯定会推荐Controller As语法。

它更干净,更高效,可以组织更多的代码,这是做AngularJS的新方法。

除非你正在使用$ scope语法的团队,否则肯定使用Controller As。