Bạn cần lưu ý về cách AngularJS hoạt động để hiểu nó.
Chu kỳ tiêu hóa và phạm vi $
Đầu tiên và quan trọng nhất, AngularJS định nghĩa một khái niệm về cái gọi là chu trình tiêu hóa . Chu trình này có thể được coi là một vòng lặp, trong đó AngularJS kiểm tra nếu có bất kỳ thay đổi nào đối với tất cả các biến được theo dõi bởi tất cả các $scope
s. Vì vậy, nếu bạn đã $scope.myVar
xác định trong bộ điều khiển của mình và biến này được đánh dấu để được theo dõi , thì bạn đang ngầm nói với AngularJS để theo dõi các thay đổi trên myVar
trong mỗi lần lặp của vòng lặp.
Một câu hỏi tiếp theo tự nhiên sẽ là: Có phải mọi thứ đều gắn liền với $scope
việc được theo dõi? May mắn thay, không. Nếu bạn sẽ theo dõi các thay đổi đối với mọi đối tượng trong bạn $scope
, thì nhanh chóng một vòng lặp tiêu hóa sẽ mất nhiều thời gian để đánh giá và bạn sẽ nhanh chóng gặp phải các vấn đề về hiệu suất. Đó là lý do tại sao nhóm AngularJS đã cho chúng tôi hai cách khai báo một số $scope
biến là được theo dõi (đọc bên dưới).
$ watch giúp lắng nghe thay đổi phạm vi $
Có hai cách khai báo một $scope
biến là được theo dõi.
- Bằng cách sử dụng nó trong mẫu của bạn thông qua biểu thức
<span>{{myVar}}</span>
- Bằng cách thêm nó thủ công thông qua
$watch
dịch vụ
Quảng cáo 1) Đây là tình huống phổ biến nhất và tôi chắc chắn bạn đã từng thấy nó trước đây, nhưng bạn không biết rằng điều này đã tạo ra một chiếc đồng hồ ở chế độ nền. Vâng, nó đã có! Sử dụng các chỉ thị AngularJS (chẳng hạn như ng-repeat
) cũng có thể tạo ra đồng hồ ngầm.
Quảng cáo 2) Đây là cách bạn tạo đồng hồ của riêng mình . $watch
dịch vụ giúp bạn chạy một số mã khi một số giá trị được đính kèm $scope
đã thay đổi. Nó hiếm khi được sử dụng, nhưng đôi khi là hữu ích. Ví dụ: nếu bạn muốn chạy một số mã mỗi lần thay đổi 'myVar', bạn có thể thực hiện các thao tác sau:
function MyController($scope) {
$scope.myVar = 1;
$scope.$watch('myVar', function() {
alert('hey, myVar has changed!');
});
$scope.buttonClicked = function() {
$scope.myVar = 2; // This will trigger $watch expression to kick in
};
}
$ áp dụng cho phép tích hợp các thay đổi với chu trình phân loại
Bạn có thể nghĩ về $apply
chức năng như một cơ chế tích hợp . Bạn thấy đấy, mỗi khi bạn thay đổi một số biến được xem$scope
trực tiếp gắn vào đối tượng, AngularJS sẽ biết rằng sự thay đổi đã xảy ra. Điều này là do AngularJS đã biết để theo dõi những thay đổi đó. Vì vậy, nếu nó xảy ra trong mã được quản lý bởi khung, chu trình phân loại sẽ tiếp tục.
Tuy nhiên, đôi khi bạn muốn thay đổi một số giá trị bên ngoài thế giới AngularJS và xem các thay đổi lan truyền bình thường. Hãy xem xét điều này - bạn có một $scope.myVar
giá trị sẽ được sửa đổi trong $.ajax()
trình xử lý của jQuery . Điều này sẽ xảy ra tại một số điểm trong tương lai. AngularJS không thể chờ đợi điều này xảy ra, vì nó đã không được hướng dẫn để chờ đợi trên jQuery.
Để giải quyết điều này, $apply
đã được giới thiệu. Nó cho phép bạn bắt đầu chu trình tiêu hóa một cách rõ ràng. Tuy nhiên, bạn chỉ nên sử dụng điều này để di chuyển một số dữ liệu sang AngularJS (tích hợp với các khung công tác khác), nhưng không bao giờ sử dụng phương pháp này kết hợp với mã AngularJS thông thường, vì AngularJS sẽ gặp lỗi sau đó.
Làm thế nào là tất cả những điều này liên quan đến DOM?
Vâng, bạn thực sự nên làm theo hướng dẫn một lần nữa, bây giờ bạn biết tất cả điều này. Chu trình phân loại sẽ đảm bảo rằng giao diện người dùng và mã JavaScript được đồng bộ hóa, bằng cách đánh giá mọi người theo dõi được đính kèm với tất cả $scope
miễn là không có gì thay đổi. Nếu không có nhiều thay đổi xảy ra trong vòng lặp digest, thì nó được coi là kết thúc.
Bạn có thể đính kèm các đối tượng vào $scope
đối tượng một cách rõ ràng trong Bộ điều khiển hoặc bằng cách khai báo chúng {{expression}}
dưới dạng trực tiếp trong dạng xem.
Tôi hy vọng điều đó sẽ giúp làm rõ một số kiến thức cơ bản về tất cả điều này.
Đọc thêm: