2017-09-26 74 views
0

我想,当一个变量发生变化,所以它似乎是观察到这里去 的方式来触发一个事件是我的服务:认购不触发

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变化(基本全新广告加载),它不会触发认购

+1

工作,我相信你正在寻找一个rxjs主题(https://github.com/Reactive-Extensions/RxJS/blob /master/doc/gettingstarted/subjects.md)这允许您将值推送给主题,订阅它的任何内容都将监听更改。 – LLai

回答

1

我相信你想为这一个主题。 (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。每当主题收到新值时,打开控制台查看成功回调。这是一个主题的基本例子。请注意,有不同类型的主题,所以我建议通过他们,看看哪一个最适合您的需求。

+0

谢谢你,是我修改了一下,它工作(公布最终结果) – pajouk

0

谢谢你,从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); 

    } 

}