2017-01-28 7 views
1

私には2つのコンポーネントがあります。 コンポーネントの1つは、サブスクリプションを使用してメンバー(前述のBehaviorSubject)を追跡します。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

でそれを宣言する、すなわちどのようにあなたのクリック方法がどのように見えるのでしょうか? – Alex

+0

私は実際に観測可能な静的にすることで解決することができました。 –

答えて

1

あなたがコンポーネントにサービスを提供するときは、すべてのNavigationbarComponentためCountServiceの新しいインスタンスを取得します。 コンポーネントがルータによって追加された場合、ルート変更ごとにコンポーネントとサービスが破棄され、再作成される可能性があります。

代わりに@NgModule()(遅延のないモジュールのみ)でサービスを提供すると、アプリケーション全体で1つのインスタンスしか存在しません。

+0

これで、カウントは更新されましたが、値は countObservable.next(this.count)でプッシュされました。 –

3

おそらく、個々のコンポーネントで使用されるprovidersアレイのために起こっていると思われます。

個々のコンポーネントからprovides:[CountService]を削除し、値をプッシュする通知んかrootcomponent's @NgModule

関連する問題