2016-07-14 25 views
5

Vì vậy, tôi vừa mới bắt đầu lập trình với Angular 2 và vừa bắt đầu tìm hiểu về đăng ký, Chủ đề và Hành vi. Hiện tại tôi có nhiều đăng ký để nhận các giá trị được lưu trữ trong dịch vụ của mình và được phát ra thành một thành phần. Ứng dụng của tôi hoạt động và tất cả nhưng tôi biết nó rất kém hiệu quả. Rằng nó đã nhận được ra khỏi tầm tay trong thành phần của tôi:Cách kết hợp nhiều Đài quan sát với nhau trong Angular 2

this.threatService.minLimitChange$.subscribe(min => { this.min = min; this.getSession();}); 
this.threatService.maxLimitChange$.subscribe(max => { this.max = max; this.getSession();}); 

(và như 5 khác hơn là có được một giá trị duy nhất và gọi chức năng getSession() mỗi lần)

Trong threat.service tôi:

private minLimitChangeSource = new BehaviorSubject<number>(this.min); 
private maxLimitChangeSource = new BehaviorSubject<number>(this.max); 
minLimitChange$ = this.minLimitChangeSource.asObservable(); 
maxLimitChange$ = this.maxLimitChangeSource.asObservable(); 

Vì vậy, tôi đã cố gắng:

this.threatService.minLimitChange$.concat(this.threatService.maxLimitChange$).subscribe(res => console.log(res)); 

những mục tiêu của tôi là chỉ để kiểm tra những gì res là bởi vì tôi không chắc chắn làm thế nào để truy cập vào hai giá trị ... nhưng tôi nhận được điều này trong giao diện điều khiển của tôi. ;/

TypeError: this.threatService.minLimitChange$.merge is not a function. (In 'this.threatService.minLimitChange$.concat(this.threatService.maxLimitChange$)', 'this.threatService.minLimitChange$.concat' is undefined) 

Cuối cùng, tôi muốn để có được tất cả các giá trị mà getSession() cần từ dịch vụ của tôi và chạy chức năng lần. Tôi thực sự đánh giá cao sự giúp đỡ hoặc giải thích về cách sử dụng concat, merge hoặc forkJoin để kết hợp các đăng ký của tôi. Cảm ơn bạn!

Trả lời

10

Bạn có thể sử dụng Observable.combineLatest để kết hợp 2 dòng quan sát được vào một:

combineObs = obs1.combineLatest(obs2, 
    (val1, val2) => { 
    return {val1: val1, val2: val2}; 
    }); 

plunker làm việc: http://plnkr.co/edit/mmCzEmdKexpaWNM53me9?p=preview

+0

Ah tôi xem! Điều đó có vẻ gần với những gì tôi muốn tuy nhiên, tôi không sử dụng các giá trị thông qua phương thức {{}} trong html. Ứng dụng của tôi thực sự là trình tạo biểu đồ hiển thị các điểm dữ liệu theo thanh trượt trong thành phần giao diện người dùng. Vì vậy, luồng dữ liệu: Thanh trượt trong ** Thành phần giao diện người dùng ** gửi giá trị tối đa và tối thiểu> ** Dịch vụ ** lưu trữ và phát ra tới người đăng ký> ** Thành phần biểu đồ ** chạy một hàm với các giá trị đó. Vì vậy, nếu tôi đã đặt kết hợpLatest trong thành phần biểu đồ của tôi, làm thế nào tôi sẽ gán nó cục bộ trong các giá trị tối đa và tối thiểu của thành phần? – mshantic

+0

Hey kiểm tra liên kết plnkr đính kèm. Về cơ bản ý tưởng là để đạt được nhiệm vụ của bạn trong 2 bước: 1. Kết hợp hai luồng vào một, luồng thứ ba sẽ phát ra một giá trị mới mỗi khi một trong hai luồng nguồn có một giá trị mới; 2. Lắng nghe luồng kết hợp và điền dữ liệu cục bộ của bạn dựa trên dữ liệu được kết hợp. Tôi đã chứng minh cả trong plnkr. –

+1

Cảm ơn bạn! Nó hoạt động nows và cắt giảm rất nhiều mã dự phòng. Bị mất vì tôi không có một lớp học như Cài đặt và tôi có một dịch vụ riêng biệt và một thành phần chính để các chức năng và biến không cùng nhau như người chia bài của bạn. Nhưng bây giờ tôi đã hiểu (: Cảm ơn bạn một lần nữa! – mshantic

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