BehaviorSubject保持重置为原始值

时间:2017-01-28 14:35:46

标签: angular rxjs observable behaviorsubject

我有一个角度2项目,其中我有几个组件。 其中一个组件使用订阅跟踪成员(即上述BehaviorSubject)。

当用户单击按钮时,将更新并推送BehaviorSubject的值。

但是,订阅时,唯一推送的值是原始值(即0)。

Navbar组件是订阅者,其中在CountService中声明了BehaviorSubject。

我的CountService:

@Injectable()
export class CountService {
    private count:number;
    public countObservable:BehaviorSubject<number>;
    public savedItems = { campaigns: [], news: [] };

    constructor (private http: Http) {
        this.count=0;
        this.countObservable = new BehaviorSubject<number>(this.count);
        this.countObservable.next(this.count);
    }

    keep(keepId: string, type: string){
        !!this.savedItems[type].length ?
            this.savedItems[type].find(i => i == keepId).length ?
            console.log('exist') : this.keepInSavedItems(keepId, type)
            this.keepInSavedItems(keepId, type);
    }

    keepInSavedItems(keepId, type){
        this.savedItems[type].push(keepId);
        this.count++;
        this.countObservable.next(this.count);
    }
}

我的导航栏组件:

@Component({
  selector: 'navbar',
  templateUrl: './navbar.component.html',
  providers: [ CountService ]
})
export class NavigationbarComponent implements OnInit {
  count:number;

  constructor(public countService: CountService){
    this.count=0;
  }

  ngOnInit() : void {
    this.countService.countObservable.subscribe( count => this.count=count);
  }
}

2 个答案:

答案 0 :(得分:3)

可能由于个别组件中使用的 providers 数组而发生这种情况。

从各个组件中删除 provides:[CountService] ,并在 rootcomponent's @NgModule

中声明

答案 1 :(得分:2)

当您在组件中提供服务时,您将为每个CountService获取NavigationbarComponent的新实例。 如果路由器添加了组件,则每次路由更改都可能会破坏并重新创建组件和服务。

如果您只在@NgModule()(仅限非延迟加载的模块)中提供服务,那么整个应用程序只会有一个实例。