我有一个角度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);
}
}
答案 0 :(得分:3)
可能由于个别组件中使用的 providers
数组而发生这种情况。
从各个组件中删除 provides:[CountService]
,并在 rootcomponent's @NgModule
答案 1 :(得分:2)
当您在组件中提供服务时,您将为每个CountService
获取NavigationbarComponent
的新实例。
如果路由器添加了组件,则每次路由更改都可能会破坏并重新创建组件和服务。
如果您只在@NgModule()
(仅限非延迟加载的模块)中提供服务,那么整个应用程序只会有一个实例。