【问题标题】:Angular 4 Subscribing to observable is not updating after changeAngular 4订阅observable在更改后不会更新
【发布时间】:2018-01-24 22:17:21
【问题描述】:

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

}

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 太棒了!感谢您的快速回复。它现在似乎可以工作了,我不得不将其更改为“new BehaviorSubject([])”,因为尖括号会导致错误。
  • 啊,对不起。我把 Java 和 TS 混在一起了。
猜你喜欢
  • 2019-01-20
  • 1970-01-01
  • 2019-06-05
  • 2017-10-18
  • 1970-01-01
  • 2018-09-08
  • 2018-07-13
  • 2018-03-31
  • 2021-01-28
相关资源
最近更新 更多