2017-01-04 11 views
5

Tôi đang sử dụng durandal và requirejs để soạn chế độ xem của tôi. Tôi cũng đang tìm kiếm phương thức gọi lại vòng đời thành phần deactivate mỗi khi tôi điều hướng khỏi chế độ xem. Tôi muốn vứt bỏ viewmodel của tôi trong phương thức này.Làm thế nào để vứt bỏ một viewmodel trong Durandal sau khi ngừng hoạt động

Tôi đã thử delete this, this = undefined nhưng dường như chúng không hoạt động.

Tôi cũng đang sử dụng sự kiện aggregator Durandal như thế này:

self.activate =() => { 
     App.trigger("testEvent"); 
    }; 

    App.on("testEvent").then(() => 
    { 
     alert('Event Triggered!'); 
    }); 

Vì vậy, mỗi khi viewmodel được nạp, sự kiện này sẽ được kích hoạt. Bây giờ, nếu tôi điều hướng khỏi chế độ xem, sau đó điều hướng trở lại (do đó chế độ xem sẽ được tải lại), sau đó sự kiện sẽ được kích hoạt hai lần. Nếu tôi điều hướng đến chế độ xem lần thứ 3, sự kiện sẽ được kích hoạt 3 lần, v.v. Vì vậy, các mô hình xem trước đó vẫn còn hiện diện, đó là lý do tại sao sự kiện durandal đang được kích hoạt bởi mỗi chế độ xem. Do đó, để khắc phục sự cố này, tôi cần phải hủy bỏ chế độ xem trong chế độ hủy kích hoạt, làm cách nào tôi có thể thực hiện việc này?

Lưu ý. viewmodels trong câu hỏi là thoáng qua, không singleton.

Trả lời

2

Durandal cũng cung cấp móc nối vòng đời "được đính kèm" chỉ kích hoạt khi khung nhìn được đính kèm trong DOM. Nếu bạn đặt đăng ký sự kiện của mình ở đây, họ chỉ nên đăng ký một lần.

http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks

EDIT:

Theo như hủy đăng ký từ các sự kiện đi, nếu bạn lưu giá trị trả về từ các thuê bao bạn có thể gọi .off sau này trong Tắt của bạn hoặc các phương pháp tách

var subscription = App.on("testEvent"); 
... 
subscription.off(); 

http://durandaljs.com/documentation/Leveraging-Publish-Subscribe.html

Chế độ xem mô hình chính nó chỉ là đối tượng javascript được quản lý và sẽ được xử lý tự động sau khi tất cả các tham chiếu đến nó biến mất.

+0

Hủy đăng ký dường như thực hiện thủ thuật; các sự kiện của tôi không còn được gọi nhiều lần nữa. Có cách nào để thực sự kiểm tra để đảm bảo chế độ xem của tôi đã được xử lý hay bạn không bận tâm? – Viqas

+0

Có thể không đáng để thử trừ khi bạn đang tạo hàng trăm mô hình xem, nhưng bạn có thể sử dụng công cụ dành cho nhà phát triển Chrome để theo dõi số lượng đối tượng javascript và phân bổ bộ nhớ để đảm bảo bộ thu dọn rác dọn dẹp thành công đối tượng. –

1

Có thể việc giữ tham chiếu đến mô hình chế độ xem của bạn vì bạn đang đăng ký sự kiện 'testEvent' nhưng không bao giờ hủy đăng ký. Tôi không phải là chuyên gia về cách nó sẽ xử lý trong javascript nhưng đã xảy ra tình huống tương tự trong .net

Sự kiện của bạn sẽ không được kích hoạt ba lần, nó sẽ được kích hoạt một lần nhưng chức năng xử lý sự kiện sẽ được gọi đăng ký như vậy sau 3 lần điều hướng, 3 lần.

Hãy thử hủy đăng ký phương thức hủy kích hoạt và xem nó có hoạt động không. Điều này sẽ ít nhất là dừng xử lý sự kiện bắn ba lần. Tôi không chắc chắn điều này sẽ xử lý các mô hình xem của bạn một cách chính xác mặc dù.

Các vấn đề liên quan