订阅未触发
Subscription not triggering
我试图在变量改变时触发一个事件,所以看起来 observable 是可行的方法
这是我的服务:
import { Injectable } from '@angular/core';
import {Ad} from './../ad/ad';
import {Observable} from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
@Injectable()
export class SearchResultService {
public ads : Ad[] = [];
getAdsObservable(): Observable<Ad[]> {
return Observable.of(this.ads);
}
}
和组件:
import {Component } from '@angular/core';
import {Ad} from './../ad/ad';
import {SearchResultService} from './../search/searchResult.service';
import {Observable} from 'rxjs/Observable';
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'map',
template : '
<div #map id="map" class='main_map' ></div>
',
})
export class mapComponent {
obs;
subscription: Subscription;
constructor(
private searchResultService: SearchResultService,
){
this.obs = this.searchResultService.getAdsObservable();
}
ngOnInit(){
this.subscription = this.obs.subscribe(
value => {
console.log('subscribe trigger');
});
}
}
现在的问题是,当searchResultService.ads发生变化(加载基本的新广告)时,它不会触发订阅
您可以查看 ngOnChange
,因为您只是在组件初始化时查看信息,您应该要求它在数据流发生变化后也查找数据
我相信你想要一个主题。 (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md) 本质上你订阅了这个主题,然后当有东西被推送到这个主题时,所有的观察者都会在他们的成功回调中收到那个值。
// service.ts
mySubject<Ad[]> = new Subject();
ads: Ad[] = [];
setAd(ad: Ad){
this.ads.push(ad);
// anything subscribed to mySubject will receive this.ads when .next() is called
this.mySubject.next(this.ads);
}
这是主题 (https://plnkr.co/edit/cfWbBIV7hDWRKFfjJlyl?p=preview) 的工作 plnkr。打开您的控制台以查看每次主题收到新值时触发的成功回调。这是一个主题的基本示例。请注意,有不同类型的主题,因此我建议您仔细阅读它们,看看哪一个最适合您的需要。
谢谢,从 LLai 的回答中,我设法使用
让它工作
import { Injectable } from '@angular/core';
import {Ad} from './../ad/ad';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
@Injectable()
export class SearchResultService {
public ads : Ad[] = [];
public ads_observable : BehaviorSubject<Ad[]> ;
constructor() {
this.ads_observable = new BehaviorSubject<Ad[]>(this.ads);
}
setAds(data){
this.ads = Ad.toObjectArray(data.ads);
this.ads_observable.next(this.ads);
}
}
我试图在变量改变时触发一个事件,所以看起来 observable 是可行的方法 这是我的服务:
import { Injectable } from '@angular/core';
import {Ad} from './../ad/ad';
import {Observable} from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
@Injectable()
export class SearchResultService {
public ads : Ad[] = [];
getAdsObservable(): Observable<Ad[]> {
return Observable.of(this.ads);
}
}
和组件:
import {Component } from '@angular/core';
import {Ad} from './../ad/ad';
import {SearchResultService} from './../search/searchResult.service';
import {Observable} from 'rxjs/Observable';
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'map',
template : '
<div #map id="map" class='main_map' ></div>
',
})
export class mapComponent {
obs;
subscription: Subscription;
constructor(
private searchResultService: SearchResultService,
){
this.obs = this.searchResultService.getAdsObservable();
}
ngOnInit(){
this.subscription = this.obs.subscribe(
value => {
console.log('subscribe trigger');
});
}
}
现在的问题是,当searchResultService.ads发生变化(加载基本的新广告)时,它不会触发订阅
您可以查看 ngOnChange
,因为您只是在组件初始化时查看信息,您应该要求它在数据流发生变化后也查找数据
我相信你想要一个主题。 (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md) 本质上你订阅了这个主题,然后当有东西被推送到这个主题时,所有的观察者都会在他们的成功回调中收到那个值。
// service.ts
mySubject<Ad[]> = new Subject();
ads: Ad[] = [];
setAd(ad: Ad){
this.ads.push(ad);
// anything subscribed to mySubject will receive this.ads when .next() is called
this.mySubject.next(this.ads);
}
这是主题 (https://plnkr.co/edit/cfWbBIV7hDWRKFfjJlyl?p=preview) 的工作 plnkr。打开您的控制台以查看每次主题收到新值时触发的成功回调。这是一个主题的基本示例。请注意,有不同类型的主题,因此我建议您仔细阅读它们,看看哪一个最适合您的需要。
谢谢,从 LLai 的回答中,我设法使用
让它工作import { Injectable } from '@angular/core';
import {Ad} from './../ad/ad';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
@Injectable()
export class SearchResultService {
public ads : Ad[] = [];
public ads_observable : BehaviorSubject<Ad[]> ;
constructor() {
this.ads_observable = new BehaviorSubject<Ad[]>(this.ads);
}
setAds(data){
this.ads = Ad.toObjectArray(data.ads);
this.ads_observable.next(this.ads);
}
}