$ áp dụng so với $ thông báo trong thử nghiệm chỉ thị


98

Nếu tôi có một chỉ thị phản hồi trạng thái của một thuộc tính cụ thể trên phạm vi và tôi muốn thay đổi thuộc tính đó trong thử nghiệm của mình và xác minh rằng nó phản hồi chính xác, thì cách tốt nhất để thực hiện thay đổi đó là gì?

Tôi đã thấy cả hai mẫu này:

scope.$apply(function() {
    scope.myAttribute = true;
});

scope.myAttribute = true;
scope.$digest();

Sự khác biệt giữa chúng là gì, cái nào tốt hơn và tại sao?

Câu trả lời:


206

scope.$digest()sẽ sa thải những người theo dõi trên phạm vi hiện tại và trên tất cả các con của nó. scope.$applysẽ đánh giá chức năng đã thông qua và chạy $rootScope.$digest().

Cách đầu tiên nhanh hơn, vì nó cần đánh giá những người theo dõi cho phạm vi hiện tại và con của nó. Cái thứ hai chậm hơn, vì nó cần đánh giá những người theo dõi $rootScopevà tất cả các phạm vi đó là trẻ em.

Khi lỗi xảy ra ở một trong các trình theo dõi và bạn sử dụng scope.$digest, lỗi đó không được xử lý thông qua $exceptionHandlerdịch vụ, vì vậy bạn cần tự xử lý ngoại lệ. scope.$applysử dụng một try-catchkhối bên trong và chuyển tất cả các ngoại lệ cho $exceptionHandler.


1
Cũng sẽ $digestđược gọi là trẻ em của phạm vi?
pilau

15
Điều này có thể gây hiểu lầm. $digestkhông chỉ những người canh lửa trên phạm vi hiện tại, mà còn trên tất cả các con của nó.
tasseKATT

@tasseKATT, tôi nghĩ rằng tôi đã nắm bắt được những gì nhận xét của bạn đang gợi ý.
kích hoạt vào

12

Như bản thân tài liệu đề cập đến chu kỳ thông báo $ được thực hiện bất kỳ lúc nào bạn làm $scope.$apply. Theo hướng dẫn của nhà phát triển về phạm vi

Sau khi đánh giá biểu thức, phương thức $ apply thực hiện một thông báo $. Trong giai đoạn thông báo $, phạm vi kiểm tra tất cả các biểu thức $ watch và so sánh chúng với giá trị trước đó.

Và theo tài liệu API phạm vi

Thông thường, bạn không gọi $ digan () trực tiếp trong bộ điều khiển hoặc trong các lệnh. Thay vào đó, một lệnh gọi đến $ apply () (thường là từ bên trong một chỉ thị) sẽ buộc một $ thông báo ().

Vì vậy, bạn không nên gọi một cách rõ ràng $digest, $applyphương thức gọi của bạn sẽ kích hoạt một chu kỳ thông báo.


8
điều này không đúng vì thông báo là đủ cho hầu hết các trường hợp chỉ cần đánh giá phạm vi hiện tại và phạm vi con của nó. đúng là $ scope. $ apply gọi $ tiêu hóa nội bộ nhưng điều rất quan trọng cần nhớ là nó sẽ kết thúc cuộc gọi $ rootScope. $ tiêu hóa () và do đó rất nặng
Srivathsa Harish Venkataramana
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.