2016-12-16 23 views
8

quan sát được Tôi đang tạo một ứng dụng kéo và thả và tôi đã tạo một vị trí quan sát được với vị trí chuột, có thể đặt lại vị trí drag-object của tôi.hủy đăng ký không phải là chức năng trên

mouseMove$: any; 

constructor(){ 
    this.mouseMove$ = Observable.fromEvent(document, 'mousemove') 
    .do((mouseevent: MouseEvent) => { 
     if (document.getElementById("drag-object")){ 
     document.getElementById("drag-object").style.left = (mouseevent.clientX) + 'px'; 
     document.getElementById("drag-object").style.top = (mouseevent.clientY) + 'px'; 
     } 
    }); 

Với thi này, tôi không có vấn đề đăng ký theo cách này:

this.mouseMove$.subscribe(); 

tuy nhiên tôi dường như không thể ngừng đăng ký bởi một trong hai:

this.mouseMove$.unsubscribe(); 

hoặc

this.mouseMove$.dispose(); 

trong cả hai trường hợp tôi nhận được các loại sau đây của các lỗi:

TypeError: this.mouseMove$.unsubscribe is not a function ...

Tôi không chắc chắn nếu điều này đã làm với các loại mouseMove$ của any, nhưng thiết lập các kiểu như ObservableObservable<MouseEvent> đã không làm việc. Tôi không hiểu gì ở đây?

Trả lời

15

Bạn đang có lẽ sử dụng một phiên bản mới hơn của RxJS, nơi đã có một sự thay đổi API nơi Observable.subscribe trả về một Disposable, từ đó bạn gọi .unsubscribe bây giờ (dispose trở thành unsubscribe trong RxJS5). Thật không may, vẫn còn rất nhiều bài hướng dẫn cũ và bài đăng trên blog làm điều đó "theo cách cũ", dẫn đến sự nhầm lẫn này.

Do đó, mã của bạn nên được

let disposeMe = this.mouseMove$.subscribe(); 

và, sau khi bạn đã hoàn tất

disposeMe.unsubscribe(); 

Đối với một danh sách đầy đủ các API thay đổi từ bản 4-5, kiểm tra this file.

3

đảm bảo this.mouseMove$ của bạn là một chú ý đầu tiên:

if (this.mouseMove$ !== undefined) { 
    this.mouseMove$.unsubscribe(); 
} 

lẽ trong trường hợp của bạn, bạn huỷ đăng ký trước khi this.mouseMove$ chưa được gán giá trị nào được nêu ra.

-2

Hãy xem brianflove.com.

Bằng cách đặt mouseMove $: ISubscription, nên giải quyết vấn đề.

+0

bạn có thể sửa đổi câu trả lời với mô tả chính không? – Sergii

+0

Thay vì sử dụng "mouseMove $: any", hãy khai báo kiểu dữ liệu thành ISubscription, sẽ xóa lỗi bạn đang thấy. – Roger

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