Làm cách nào để buộc làm mới chế độ xem mà không kích hoạt tự động từ một thiết bị quan sát?


151

Lưu ý: điều này chủ yếu là để gỡ lỗi và hiểu KnockoutJS.

Có cách nào để yêu cầu Knockout rõ ràng để làm mới khung nhìn từ mô hình khung nhìn (đã bị ràng buộc) không? Tôi đang tìm kiếm một cái gì đó như:

ko.refreshView();

Tôi hiểu rằng đây không phải là mục đích sử dụng của Knockout, nhưng tôi vẫn muốn biết liệu có một phương pháp như vậy để gỡ lỗi và mục đích học tập hay không.

Câu trả lời:


252

Bạn không thể gọi một cái gì đó trên toàn bộ viewModel, nhưng trên một cá nhân có thể quan sát được, bạn có thể gọi myObservable.valueHasMutated()để thông báo cho người đăng ký rằng họ nên đánh giá lại. Điều này thường không cần thiết trong KO, như bạn đã đề cập.


5
Bạn cũng có thể lặp lại qua bối cảnh dữ liệu, tìm kiếm các phần tử có thuộc valueHasMutatedtính thuộc loại functionvà gọi nó cho từng phần tử. Điều đó sẽ nhận được tất cả các quan sát của bạn, nhưng đó là thực tế tồi tệ và có thể hình dung ra nhiều cập nhật hơn nhiều so với bạn dự đoán (nghĩ rằng chuỗi phụ thuộc được tính toán).
Patrick M

Nó chắc chắn sẽ tốt nếu không có gì khác - thử nghiệm trong chrome.
Scott Romack

Bản thân viewModel của bạn có thể quan sát được, vì vậy bạn có thể gọi myViewModel.valueHasMutated()để cập nhật toàn bộ chế độ xem.
Roy J

2
Không hoạt động trên mảng ở đây. Trong thực tế, các mảng dường như không hoạt động ở Knockout. Tôi nhớ Angular :-(
garryp

2
Nó không làm việc trên KnockoutObservableArrays như của KO 3,5
Balint

25

Trong một số trường hợp, có thể hữu ích chỉ cần loại bỏ các ràng buộc và sau đó áp dụng lại:

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))

Cảm ơn đã chỉnh sửa ebram ... Đoán tôi nên đề cập đến tôi sử dụng coffeescript ;-)
ProfNimrod

15
Xem ra nếu bạn cũng sử dụng jQuery (ví dụ: khi di chuyển các bit của ứng dụng sang ko) vì CleanNode cũng sẽ xóa các sự kiện dom khác.
Dan Revell

Đây là hoàn hảo. Tôi không thể nhận KO để nhận ra các con dom MỚI với các thuộc tính liên kết dữ liệu sau khi chế độ xem được áp dụng.
Andrew T Finnell

Hoàn hảo! Đang làm việc!
jeff_drumgod

0

Tôi đã tạo một JSFiddle bằng trình xử lý ràng buộc loại bỏ ràng buộc của mình tại đây: https://jsfiddle.net/glaivier/9859uq8t/

Đầu tiên, lưu trình xử lý ràng buộc vào tệp riêng (hoặc chung) và bao gồm sau Knockout.

Nếu bạn sử dụng công tắc này, các ràng buộc của bạn với điều này:

<div data-bind="bindHTML: htmlValue"></div>

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
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.