Angularjs“Controller as”或“$ scope”
我想知道angularjs中“Controller as”或“$ scope”语法的主要区别是什么。
- 他们是否有任何性能影响,如果是的话哪种语法更好。
- “Controller as”语法肯定会提高代码的可读性,因为Knockout.js和其他JavaScript框架遵循相同的语法。
-
$范围将提供范围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.Address
和storeCtrl.Address
,可以更容易地识别出您拥有由多个不同控制器分配的地址,而不是同时使用$scope.Address
。 在一个页面上有两个不同的HTML元素,这两个HTML元素都绑定到{{Address}}
并知道哪一个元素只包含在控制器中,这是解决问题的一大麻烦。
最后,除非你正在试图做一个10分钟的演示,否则你真的应该使用ControllerAs来处理任何严重的Angular工作。
我肯定会推荐Controller As语法。
它更干净,更高效,可以组织更多的代码,这是做AngularJS的新方法。
除非你正在使用$ scope语法的团队,否则肯定使用Controller As。