[英]Angularjs “Controller as” or “$scope”
我想知道angularjs中“ Controller as”或“ $ scope”语法之间的主要区别是什么。
$ scope将提供范围继承,有时会给我们带来奇怪的行为,例如
<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)最初child将获得parent属性,并且在我们更新父级时显示“ parentScope”,child也将得到更新。 但是,如果我们现在更改了child属性,则更新父级不会修改child,因为它具有自己的scope属性。
b)如果我将控制器用作语法更改子节点,那么也会更新父节点。
过去,我已经为这个问题写了一些答案,它们基本上都归结为同一件事。 在Angular中,即使没有明确引用它,也使用$scope
。
ControllerAs语法使Angular可以帮助您编写更高效,更容错的控制器。 在后台,当您使用ng-controller="theController as ctrl"
,Angular在$scope
上创建theController
作为属性并将其分配为ctrl
。 现在,您有了要从作用域引用的对象属性,并且可以自动免受原型继承问题的影响。
从性能的角度来看,由于您仍在使用$scope
,因此几乎没有性能差异。 但是,由于您的控制器现在不再自己直接向$scope
分配变量,因此不需要注入$scope
。 而且,由于现在它只是一个普通的JavaScript函数,因此可以更容易地对控制器进行隔离测试。
从前瞻性角度来看,现在众所周知Angular 2.0将不再具有$scope
,而是将使用ECMAScript 6的功能。在Angular团队发布的任何显示迁移的预览中,它们首先都是通过重构控制器以消除$scope
来开始的。 $scope
。 如果您的代码在设计时未使用基于$scope
的控制器,则迁移的第一步已经完成。
从设计者的角度来看,ControllerAs语法使在对象的操作位置更加清晰。 与使用$scope.Address
相比,拥有customerCtrl.Address
和storeCtrl.Address
可以更容易地确定您有一个由多个不同的控制器为不同目的分配的地址。 在页面上有两个不同的HTML元素,它们都绑定到{{Address}}
,并且仅通过控制器知道该元素包含在哪个元素中,这是解决问题的主要麻烦。
最终,除非您尝试启动一个10分钟的演示,否则您真的应该使用ControllerA进行任何严肃的Angular工作。
我肯定会推荐Controller As语法。
它更干净,更高效,您可以组织更多代码,这是AngularJS的新方法。
除非您与习惯于$ scope语法的团队合作,否则请绝对使用Controller As。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.