Đối với những người xây dựng các ứng dụng phức tạp, hãy lưu ý rằng có một tác động hiệu suất đến sự lựa chọn của bạn. Ngoài ra, tôi muốn hoàn thành câu trả lời Mark với nhiều chi tiết kỹ thuật hơn:
$ timeout (gọi lại) sẽ đợi chu trình phân loại hiện tại được thực hiện (tức là cập nhật góc tất cả mô hình và DOM), sau đó nó sẽ thực hiện gọi lại - có khả năng ảnh hưởng đến mô hình góc - sau đó khởi chạy đầy đủ $apply
trên phạm vi $ root và chuyển hướng mọi điều.
$ evalAsync (gọi lại) , mặt khác, sẽ thêm cuộc gọi lại vào chu trình tiêu hóa hiện tại hoặc tiếp theo. Điều đó có nghĩa là nếu bạn đang ở trong một chu trình phân loại (ví dụ trong một hàm được gọi từ một số lệnh ng-click
), điều này sẽ không chờ đợi bất cứ điều gì, mã sẽ được thực thi ngay lập tức. Nếu bạn đang trong một cuộc gọi không đồng bộ, ví dụ a setTimeout
, một chu trình phân loại mới ( $apply
) sẽ được kích hoạt.
Vì vậy, về mặt hiệu suất, luôn luôn tốt hơn để gọi $evalAsync
, trừ khi điều quan trọng đối với bạn là chế độ xem được cập nhật trước khi thực thi mã của bạn, ví dụ nếu bạn cần truy cập vào một số thuộc tính DOm như chiều rộng phần tử và tương tự.
Nếu bạn muốn biết thêm chi tiết về sự khác biệt giữa $ timeout, $ evalAsync, $ digest, $ áp dụng, tôi mời bạn đọc câu trả lời của tôi về câu hỏi khác đó: https://stackoverflow.com/a/23102223/1501926
Cũng hãy chắc chắn đọc tài liệu :
$ EvalAsync không đảm bảo khi nào biểu thức sẽ được thực thi, chỉ có điều:
- nó sẽ thực thi sau khi chức năng lên lịch đánh giá (tốt nhất là trước khi kết xuất DOM).
- ít nhất một chu kỳ $ digest sẽ được thực hiện sau khi thực hiện biểu thức.
Lưu ý: nếu chức năng này được gọi bên ngoài chu trình $ digest, chu kỳ $ digest mới sẽ được lên lịch . Tuy nhiên, khuyến khích luôn gọi mã thay đổi mô hình từ trong cuộc gọi áp dụng $. Điều đó bao gồm mã được đánh giá qua $ evalAsync.