Ràng buộc hai chiều bị giới hạn hầu như chỉ dành cho các thành phần sử dụng ng-model
. Hướng đi từ chế độ xem đến mô hình sử dụng trình xử lý sự kiện chuẩn để phát hiện các thay đổi phải được cập nhật trong mô hình (ví dụ: onchange
). Hướng đi từ mô hình trở lại chế độ xem được cập nhật trong một $digest
. Nhưng chúng tôi không gọi trực tiếp số $digest
.
Mọi phần tử trên trang của bạn sẽ phản hồi chu kỳ thông báo, ở đâu đó, đính kèm người nghe và biểu thức vào phạm vi sử dụng $watch
. Khi bạn viết {{ foo() }}
hoặc khi bạn sử dụng ng-model='user.name'
, nội bộ có lời gọi đến số $watch
được thực hiện nhân danh bạn với một biểu thức Javascript sẽ được chạy mỗi khi chu trình tiêu hóa được chạy.Việc đăng ký này có thể xảy ra trong quá trình biên dịch mẫu (ví dụ đầu tiên của chúng tôi), hoặc nó có thể xảy ra trong giai đoạn liên kết của một chỉ thị (thứ hai của chúng tôi).
Không có phép thuật nào ở đây. Các trình nghe được đính kèm là các hàm bình thường - trong ví dụ của chúng tôi, trình nghe cho biểu thức foo()
được cung cấp cho bạn và nó sẽ cập nhật văn bản html trên trang, trong khi trình nghe cho biểu thức user.name
sẽ gọi setText
hoặc setOption
, hoặc bất cứ điều gì được yêu cầu bởi đầu vào cụ thể mà ng-model
đã được đính kèm.
Trong khi góc cạnh có thể xử lý hầu hết việc nghe, bạn có thể đính kèm biểu thức đồng hồ của riêng mình với người nghe của mình theo cách thủ công bên trong bất kỳ chức năng nào có quyền truy cập vào phạm vi (phạm vi quan trọng vì chúng tôi sẽ chia nhỏ những người xem đó trang bị xóa). Hãy chú ý vượt quá. Bindings không miễn phí, và nhiều thứ bị ràng buộc, trang sẽ trả lời càng chậm. Liên kết một lần là một cách để giảm chi phí này. Sử dụng $on
với $emit
và $broadcast
là loại khác.
Vậy khi nào thông báo được gọi? Nó chắc chắn không phải là tự động. Nếu chu trình tiêu hóa đang chạy, điều đó có nghĩa là ai đó ở đâu đó được gọi là $apply
trên phạm vi của họ hoặc trên phạm vi gốc. ng-model
gắn các trình xử lý sẽ phản hồi các sự kiện html thông thường và sẽ thực hiện cuộc gọi tới số $apply
thay cho bạn. Nhưng foo()
, mặt khác, sẽ không bao giờ được gọi cho đến khi một số đoạn mã khác ở đâu đó gọi $apply
. May mắn thay, hầu hết các chức năng mà bạn điền vào để quấn các chức năng đó với một cuộc gọi đến $apply
, vì vậy bạn không phải tự gọi điện thoại (ví dụ: $timeout
được gói với $apply
, đó là lý do chúng tôi sử dụng nó thay vì setTimeout
) . Nhưng nếu bạn đang sử dụng thứ gì đó bên ngoài phạm vi góc (thư viện của bên thứ ba kết nối với các sự kiện), bạn cần nhớ tự gọi số $apply
và giống như trên, bạn có thể thực hiện việc này theo cách thủ công bằng cách gọi $apply
ở bất cứ nơi nào bạn có quyền truy cập đến một phạm vi.
Nguồn
2015-05-24 16:17:37