Nguồn
Sự khác biệt giữa Tạo bộ điều khiển bằng cách sử $scope object
dụng “controller as”
cú pháp và vm
Tạo bộ điều khiển bằng đối tượng $ scope
Thông thường, chúng tôi tạo một bộ điều khiển bằng cách sử dụng đối tượng $ scope như được hiển thị trong danh sách bên dưới:
myApp.controller("AddController", function ($scope) {
$scope.number1;
$scope.number2;
$scope.result;
$scope.add = function () {
$scope.result = $scope.number1 + $scope.number2;
}
});
Ở trên, chúng ta đang tạo AddController với ba biến và một hành vi, sử dụng bộ điều khiển và chế độ xem đối tượng $ scope, chúng nói chuyện với nhau. Đối tượng $ scope được sử dụng để truyền dữ liệu và hành vi tới dạng xem. Nó gắn kết chế độ xem và bộ điều khiển với nhau.
Về cơ bản, đối tượng $ scope thực hiện các tác vụ sau:
Truyền dữ liệu từ bộ điều khiển sang chế độ xem
Chuyển hành vi từ bộ điều khiển sang chế độ xem
Dán bộ điều khiển và xem với nhau
Đối tượng $ scope được sửa đổi khi một dạng xem thay đổi và một dạng xem được sửa đổi khi các thuộc tính của đối tượng $ scope thay đổi
Chúng tôi đính kèm các thuộc tính vào một đối tượng $ scope để truyền dữ liệu và hành vi đến chế độ xem. Trước khi sử dụng đối tượng $ scope trong bộ điều khiển, chúng ta cần chuyển nó vào hàm bộ điều khiển dưới dạng phụ thuộc.
Sử dụng cú pháp "controller as" và vm
Chúng ta có thể viết lại bộ điều khiển ở trên bằng cách sử dụng bộ điều khiển dưới dạng cú pháp và biến vm như được hiển thị trong danh sách dưới đây:
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;
}
});
Về cơ bản, chúng tôi đang gán điều này cho một biến vm và sau đó gắn một thuộc tính và hành vi vào đó. Trên khung nhìn, chúng ta có thể truy cập AddVmController bằng cú pháp controller. Điều này được hiển thị trong danh sách dưới đây:
<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>
Tất nhiên, chúng ta có thể sử dụng một tên khác không phải là “vm” trong bộ điều khiển làm cú pháp. Dưới mui xe, AngularJS tạo đối tượng $ scope và đính kèm các thuộc tính và hành vi. Tuy nhiên, bằng cách sử dụng bộ điều khiển làm cú pháp, mã rất rõ ràng ở bộ điều khiển và chỉ có tên bí danh được hiển thị trên khung nhìn.
Dưới đây là một số bước để sử dụng bộ điều khiển theo cú pháp:
Tạo một bộ điều khiển mà không có đối tượng $ scope.
Gán điều này cho một biến cục bộ. Tôi ưu tiên tên biến là vm, bạn có thể chọn bất kỳ tên nào tùy ý.
Đính kèm dữ liệu và hành vi vào biến vm.
Trên dạng xem, đặt bí danh cho bộ điều khiển bằng cách sử dụng bộ điều khiển làm cú pháp.
Bạn có thể đặt bất kỳ tên nào cho bí danh. Tôi thích sử dụng vm trừ khi tôi không làm việc với bộ điều khiển lồng nhau.
Trong việc tạo bộ điều khiển, không có lợi thế hoặc bất lợi trực tiếp của việc sử dụng phương pháp tiếp cận đối tượng $ scope hoặc bộ điều khiển làm cú pháp. Tuy nhiên, việc sử dụng bộ điều khiển làm cú pháp sẽ làm cho mã JavaScript của bộ điều khiển dễ đọc hơn và ngăn chặn bất kỳ vấn đề nào liên quan đến ngữ cảnh này.
Bộ điều khiển lồng nhau trong phương pháp tiếp cận đối tượng $ scope
Chúng tôi có hai bộ điều khiển như được hiển thị trong danh sách dưới đây:
myApp.controller("ParentController", function ($scope) {
$scope.name = "DJ";
$scope.age = 32;
});
myApp.controller("ChildController", function ($scope) {
$scope.age = 22;
$scope.country = "India";
});
Thuộc tính “age” nằm bên trong cả hai bộ điều khiển và trên giao diện hai bộ điều khiển này có thể được lồng vào nhau như được hiển thị trong danh sách bên dưới:
<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>
Như bạn thấy, để truy cập thuộc tính tuổi của bộ điều khiển mẹ, chúng ta đang sử dụng $ parent.age. Sự tách biệt ngữ cảnh không rõ ràng lắm ở đây. Nhưng sử dụng bộ điều khiển làm cú pháp, chúng ta có thể làm việc với các bộ điều khiển lồng nhau theo cách thanh lịch hơn. Giả sử chúng ta có bộ điều khiển như được hiển thị trong danh sách bên dưới:
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";
});
Trên giao diện hai bộ điều khiển này có thể được lồng vào nhau như được hiển thị trong danh sách dưới đây:
<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>
Trong cú pháp bộ điều khiển, chúng ta có mã dễ đọc hơn và thuộc tính mẹ có thể được truy cập bằng cách sử dụng tên bí danh của bộ điều khiển mẹ thay vì sử dụng cú pháp $ cha.
Tôi sẽ kết thúc bài đăng này bằng cách nói rằng đó hoàn toàn là lựa chọn của bạn cho dù bạn muốn sử dụng bộ điều khiển làm cú pháp hay đối tượng $ scope. Không có lợi thế hay bất lợi lớn nào đối với cả hai, chỉ đơn giản là bộ điều khiển dưới dạng cú pháp mà bạn có quyền kiểm soát trên ngữ cảnh dễ làm việc hơn một chút, với sự phân tách rõ ràng trong các bộ điều khiển lồng nhau trên khung nhìn.