资源
使用$scope object
和使用“controller as”
语法和vm 创建控制器之间的区别
使用$ scope对象创建一个控制器
通常,我们使用$ scope对象创建一个控制器,如下清单所示:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
上面,我们使用$ scope对象控制器和视图创建了具有三个变量和一个行为的AddController,它们相互通信。$ scope对象用于将数据和行为传递给视图。它将视图和控制器粘合在一起。
本质上,$ scope对象执行以下任务:
将数据从控制器传递到视图
将行为从控制器传递到视图
胶合控制器并一起查看
$ scope对象在视图更改时被修改,而视图在$ scope对象的属性更改时被修改
我们将属性附加到$ scope对象,以将数据和行为传递给视图。在控制器中使用$ scope对象之前,我们需要在控制器函数中将其作为依赖项传递。
使用“ controller as”语法和vm
我们可以使用该控制器作为语法和vm变量来重写上述控制器,如下清单所示:
myApp.controller("AddVMController", function () {
var vm = this;
vm.number1 = undefined;
vm.number2=undefined;
vm.result =undefined;
vm.add = function () {
vm.result = vm.number1 + vm.number2;
}
});
本质上,我们将其分配给变量vm,然后向其附加属性和行为。在视图上,我们可以使用controller作为语法访问AddVmController。这在下面的清单中显示:
<div ng-controller="AddVMController as vm">
<input ng-model="vm.number1" type="number" />
<input ng-model="vm.number2" type="number" />
<button class="btn btn-default" ng-click="vm.add()">Add</button>
<h3>{{vm.result}}</h3>
</div>
当然,我们可以在控制器中使用除“ vm”之外的其他名称作为语法。在幕后,AngularJS创建$ scope对象,并附加属性和行为。但是,通过使用控制器作为语法,该代码在控制器上非常干净,并且在视图上仅可见别名。
以下是将控制器用作语法的一些步骤:
创建一个没有$ scope对象的控制器。
将此分配给局部变量。我将变量名首选为vm,可以选择任何名称。
将数据和行为附加到vm变量。
在视图上,使用控制器作为语法为控制器提供别名。
您可以给别名起任何名字。我更喜欢使用vm,除非我不使用嵌套控制器。
在创建控制器时,使用$ scope对象方法或控制器作为语法没有直接的优缺点。但是,纯粹是选择问题,将控制器用作语法可以使控制器的JavaScript代码更具可读性,并避免与此上下文相关的任何问题。
$ scope对象方法中的嵌套控制器
我们有两个控制器,如下面的清单所示:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
属性“ age”位于两个控制器中,并且在视图上可以嵌套这两个控制器,如下面的清单所示:
<div ng-controller="ParentController">
<h2>Name :{{name}} </h2>
<h3>Age:{{age}}</h3>
<div ng-controller="ChildController">
<h2>Parent Name :{{name}} </h2>
<h3>Parent Age:{{$parent.age}}</h3>
<h3>Child Age:{{age}}</h3>
<h3>Country:{{country}}</h3>
</div>
</div>
如您所见,要访问父控制器的age属性,我们使用$ parent.age。上下文分离在这里不是很清楚。但是使用控制器作为语法,我们可以以更优雅的方式使用嵌套控制器。假设我们有如下清单所示的控制器:
myApp.controller("ParentVMController", function () {
var vm = this;
vm.name = "DJ";
vm.age = 32;
});
myApp.controller("ChildVMController", function () {
var vm = this;
vm.age = 22;
vm.country = "India";
});
在视图上,这两个控制器可以嵌套,如下面的清单所示:
<div ng-controller="ParentVMController as parent">
<h2>Name :{{parent.name}} </h2>
<h3>Age:{{parent.age}}</h3>
<div ng-controller="ChildVMController as child">
<h2>Parent Name :{{parent.name}} </h2>
<h3>Parent Age:{{parent.age}}</h3>
<h3>Child Age:{{child.age}}</h3>
<h3>Country:{{child.country}}</h3>
</div>
</div>
在作为语法的控制器中,我们具有更多易读的代码,并且可以使用父控制器的别名而不是$ parent语法来访问parent属性。
我将在这篇文章的结尾总结说,要使用控制器作为语法还是使用$ scope对象,这完全是您的选择。两者之间都没有巨大的优势或劣势,只是鉴于视图中嵌套控制器中的清晰分隔,简单地使您可以在上下文中控制作为控制器的语法。