订阅未触发

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,因为您只是在组件初始化时查看信息,您应该要求它在数据流发生变化后也查找数据

cf https://angular.io/guide/lifecycle-hooks

我相信你想要一个主题。 (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);

    }

}