2016-08-22 66 views
13

我试图创建自己的可观察服务,但是当我从服务获取初始数据后,服务的任何更新都不会传播给任何订户。服务看起来像这样:Angular2 Observable BehaviorSubject服务不起作用

import { Injectable } from '@angular/core'; 
import { Observable, BehaviorSubject } from 'rxjs/Rx'; 

@Injectable() 
export class DataService { 
    keys : number[] = [4,5,1,3,2]; 
    private data :BehaviorSubject<number[]> = new BehaviorSubject(this.keys); 

    constructor() {}; 

    public setKey(i:number, val:number) :void { 
    this.keys[i]=val; 
    this.data.next(this.keys); 
    } 
    public getData() :Observable<number[]> { 
    return new Observable(fn => this.data.subscribe(fn)); 
    } 
    public getKeys() :number[] { 
    return this.keys; 
    } 
} 

使用服务的组件获取初始数据就好了。该组件在构造函数中获取其数据:

constructor(public dataService: DataService) { 
    dataService.getData().subscribe(data => { 
     console.log("Gotcha!"); 
     this.data.datasets[0].data = data) 
    }); 
}; 

它在控制台日志中给出一个Gotcha。但是,在用其他地方的setKey(2,3)更新数据之后,我期待着这个.dat.next(this.keys)。 将数据发送给所有订户,并且数据将在该组件内相应地更新。但没有数据发送给用户。

我以为我觉得Observables出来,但请不要友好,如果我在这里错过了点;)任何指针在正确的方向将不胜感激!

+9

听起来像你提供的服务不止一次,这导致不同的组件获取不同的实例。 –

+1

在模块中工作时应采用什么方法。我有类似的服务。我的一些组件(在不同的模块中)在auth服务中订阅observable,当它发生变化时接收数据,但其他组件不收到数据。例如。当我的登录(btn)组件在观察者上发出下一个时,登录组件会看到更改,但是我的标题和侧栏组件在订阅时不会发生,我认为它与延迟加载或缓存或一些父母的孩子问题.. pff – webmaster

+1

@GünterZöchbauer感谢这!我作为组件的一部分和父模块提供服务。这让我疯狂! – jminuscula

回答

8

每当你发出一个值,你应该创建一个新的对象,而不是发出相同的变异对象。这将保护您免受更改检测问题的困扰。当你改变它的时候总是分配一个新对象到this.keys会更好。

this.data.next([...this.keys]); 

您可以使用asObservable()这里

public getData(): Observable<number[]> { 
    return this.data.asObservable(); 
} 

此外,还要检查什么冈特Zöchbauer说。你是否以单身身份提供服务?

+0

,就像一个魅力! (在我纠正了Gunter指出的*咳嗽*咳嗽*之后我的菜鸟错误之后).. – user3432565

21

我在某些时候遇到了同样的问题。这很可能是因为你的服务不是单身,即每个用户都得到一个新的实例。与角1相反,在A2服务不是单身人士。

如果您想让多个服务/组件共享服务的一个实例,请将其置于您的父代@Component@NgModuleproviders中。

@NgModule({ 
    declarations: [], 
    imports: [], 
    bootstrap: [AppComponent], 
    providers: [DataService] 
}) 
export class AppModule { 
} 
+1

我在bootstrap中使用过它,但也在组件内部的提供程序中使用过。将它从所有工作中移除:) tnx! 不知道,我在RC.4上,没有@NgModule。你可能指的是RC.5?当我升级我在控制台中得到各种奇怪的traceur消息,它打破了我的应用程序(遵循angular2网站的升级路径)。你有没有尝试过升级途径并逃脱了? – user3432565

+0

我只从RC5开始,所以我不太熟悉升级路径及其怪癖。我想,幸运的是我。:-) –

+0

经过几乎4个小时的尝试,每一个单一的解决方案,这终于解决了我所有的问题。非常感谢 –