Angular 4订阅observable不会在更改后更新

时间:2017-08-16 16:57:44

标签: angular angular-services angular-components angular-observable

我有一个带有observable的服务,它通过组件订阅。当订户显示初始值时,这似乎有效。我有另一个组件,然后更新observable,但新值不会显示。

服务:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of'; 

@Injectable()

export class BannerService {

    banners$: Observable<any[]> = Observable.of([]);

    getBanners(): Observable<any[]> {
        return this.banners$;
    }

    setBanners(banners: any[]): void {
        this.banners$ = Observable.of(banners);
    }

}

订阅者的组件:

import { Component, ViewEncapsulation, OnInit } from '@angular/core';

import { BannerService } from './../banner/banner.service';

@Component({
    selector: '.banner',
    templateUrl: './banner.component.html',
    styleUrls: ['./banner.component.sass'],
    encapsulation: ViewEncapsulation.None
})

export class BannerComponent implements OnInit {

    constructor(private bannerService: BannerService){}

    ngOnInit() {
        this.bannerService.banners$.subscribe(banners => {
            console.log(banners);
        });

    }
}

带有setter的组件:

import { Component, ViewEncapsulation, OnInit } from '@angular/core';

import { BannerService } from './../banner/banner.service';

@Component({
    selector: '.home-component',
    templateUrl: './home.component.html',
    styleUrls: ['./home.component.sass'],
    encapsulation: ViewEncapsulation.None
})

export class HomeComponent implements OnInit {

    data = {
        banners: [
            {
                title: 'Title 1',
                image: '../images/image1.jpg'
            },
            {
                title: 'Title 2',
                image: '../images/image2.jpg'
            },
            {
                title: 'Title 3',
                image: '../images/image3.jpg'
            }
        ]
    }

    constructor(private bannerService: BannerService){}

    ngOnInit(): void {
        this.bannerService.setBanners(this.data.banners);
    }

}

任何帮助都会非常感激,我尝试了很多不同的东西而且无法让它发挥作用。

1 个答案:

答案 0 :(得分:7)

您订阅了一个observable,然后用另一个替换了该observable。

这就像给某人一个电子邮件地址,他可以在那里阅读您发送给他的邮件,但每次发送电子邮件时都会用另一个电子邮件地址替换该电子邮件地址。显然,如果您将邮件发送到不同的地址,接收方将永远不会收到您的邮件。

您需要使用相同的,唯一的可观察对象,并使其发出新事件。使用主题是最简单的方法:

banners$: Subject<any[]> = new BehaviorSubject<any[]>([]);

setBanners(banners: any[]): void {
    this.banners$.next(banners);
}