5

我有一个通过组件订阅的可观察服务。这似乎有效,因为订阅者正在显示初始值。我有另一个组件,它正在更新 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);
        });

    }
}

带有设置器的组件:

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);
    }

}

任何帮助将不胜感激,我尝试了很多不同的东西,但无法正常工作。

4

1 回答 1

17

你订阅了一个 observable,然后用另一个 observable 替换了这个 observable。

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

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

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

setBanners(banners: any[]): void {
    this.banners$.next(banners);
}
于 2017-08-16T17:03:41.917 回答