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

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

}

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

最佳答案

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

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

你需要使用相同的、唯一的 observable,并让它发出一个新的事件。使用 Subject 是最简单的方法:

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

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

关于Angular 4 订阅 observable 在更改后不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719183/

相关文章:

angular - 响应式表单 valueChanges 如何仅观看 2 个字段 [Angular2]

angular - NgbCarousel select不切换幻灯片

javascript - 调用服务时检索 Controller 中的值并将我们从服务接收到的值返回到 Controller

Angular 2 : Input setter not picking up set event if value does not change

angular - 在 Angular 4 的组件上应用属性指令

angular - 无法将值数组推送到 Json Typescript Angular

angular - 在 Angular 的父模板中调用子组件的方法是一个好习惯吗?

javascript - AngularJS:如何在另一个 Controller 中执行方法?

javascript - 如何将数据从服务而不是 HttpClient 返回到组件

angular - 在 Angular 2+ 中生成没有 spec.ts 文件的组件