为什么是 ControllerAs 语法
控制器功能
Controller 函数只是一个 JavaScript 构造函数。因此,当视图加载时,function context
( this
)被设置为控制器对象。
情况 1 :
this.constFunction = function() { ... }
它是在 controller object
中创建的,而不是在 $scope
上创建的。视图无法访问控制器对象上定义的函数。
示例:
<a href="#123" ng-click="constFunction()"></a> // It will not work
案例 2:
$scope.scopeFunction = function() { ... }
它是在 $scope object
中创建的,而不是在 controller object
上创建的。视图只能访问 $scope
对象上定义的函数。
示例:
<a href="#123" ng-click="scopeFunction()"></a> // It will work
为什么选择 ControllerAs?
-
ControllerAs
语法使得操作对象的位置更加清晰。使用oneCtrl.name
和anotherCtrl.name
可以更容易地识别出由多个不同控制器分配的name
用于不同目的但是如果两者都使用相同的$scope.name
并且在页面上具有两个不同的 HTML 元素哪两个都与{{name}}
绑定,那么很难确定哪一个来自哪个控制器。 -
隐藏
$scope
并通过 tihuan 将控制器中的成员暴露给视图。通过设置this.*
,我们可以暴露出我们想要从控制器暴露到视图的内容。<div ng-controller="FirstCtrl"> {{ name }} <div ng-controller="SecondCtrl"> {{ name }} <div ng-controller="ThirdCtrl"> {{ name }} </div> </div> </div>
在这里,在上面的情况下 {{ name }}
将使用起来非常混乱,我们也不知道哪个与哪个控制器有关。
<div ng-controller="FirstCtrl as first">
{{ first.name }}
<div ng-controller="SecondCtrl as second">
{{ second.name }}
<div ng-controller="ThirdCtrl as third">
{{ third.name }}
</div>
</div>
</div>
为何范围?
- 当你需要访问
$watch
,$digest
,$emit
,$http
等一个或多个$ scope 方法时,请使用$scope
。 - 限制哪些属性和/或方法暴露给
$scope
,然后根据需要明确地将它们传递给$scope
。