2016-05-11 26 views
5

Bir kullanıcının uygulamada bağlandığından/oturum açıp açmadığına bakılmaksızın bir boolean içeren bir RxJS BehaviorSubject kullanmaya çalışıyorum. AncakRxJs ile sorun BehaviorSubject'ın abonesi değer değişimi konusunda bilgilendirilmiyor

import {Injectable} from '@angular/core'; 
import {Http, Headers, RequestOptions} from '@angular/http'; 
import {Credentials} from '../shared/models/credentials.model'; 
import {BehaviorSubject} from 'rxjs/BehaviorSubject'; 
import 'rxjs/Rx'; 

@Injectable() 
export class SessionService { 

    authenticated$:BehaviorSubject<boolean> = new BehaviorSubject(false); 
    currentUserAccount; 

    constructor(private http:Http) { 
    } 

    signin(credentials:Credentials) { 
     let headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}); 
     let options = new RequestOptions({headers: headers}); 
     this.http.post('/api/signin', 'username=' + credentials.username + '&password=' + credentials.password, options) 
      .subscribe(response=> 
       this.setPersonalInfo(response.headers.get('x-auth-token')) 
      ); 
    } 

    setPersonalInfo(sessionToken) { 
     localStorage.setItem('authenticated', 'true'); 
     localStorage.setItem('sessionToken', sessionToken); 
     this.authenticated$.next(true);//next() from false to true 
     this.http.get('/api/utils/current-useraccount') 
      .subscribe(param => this.currentUserAccount = param); 
    } 
} 

: Burada

import {Component, OnInit} from '@angular/core'; 
import {CollapseDirective} from 'ng2-bootstrap'; 
import {PublicNavbarComponent} from './public.navbar.component'; 
import {PrivateNavbarComponent} from './private.navbar.component'; 
import {SessionService} from '../../session/session.service'; 

@Component({ 
    selector: 'navbar', 
    templateUrl: 'app/shared/components/navbar.component.html', 
    providers: [SessionService], 
    directives: [PublicNavbarComponent, PrivateNavbarComponent, CollapseDirective] 
}) 
export class NavbarComponent implements OnInit { 

    constructor(private sessionService:SessionService) { 
    } 

    ngOnInit() { 
     this.sessionService.authenticated$.subscribe({ 
      next: (value)=> this.isAuthenticated = value 
     }); 
    } 

    isAuthenticated:boolean = false; 

    isCollapsed:boolean = true; 
} 

içeren sınıfın/hizmet BehaviorSubject olup: burada

kullanıcının kimlik doğrulaması zaman true örneğin yeni BehaviorSubject değeri abone bileşenidir Bu beklenen davranışa sahip değil: oturum hizmetinden authenticated$ yalnızcaiçinde doğru görünüyor this.authenticated$.next(true) çağrıldığındafonksiyonu ve NavbarComponent gelen isAuthenticated hiç haberdar değildir. Eğer SessionService birden çok örneği var gibi

cevap

7

görünüyor. Örneğin. Birden çok kez sağladınız ve signin aradığınız örnek, NavbarComponent içinde enjekte ettiğiniz örnekle aynı değil.

Bu sizin hizmetleri sağlamak nasıl proje tasarımı bağlıdır. Genellikle oturum hizmetleri bekardır.
NavbarComponent'dan providers: [SessionService], kaldırılmasını öneririz.

+0

Çok teşekkürler! Bu gerçekten mesele ... Sevdiğim – balteo

+0

sayesinde oldu bootstrap() 'ye değil, bunun yerine kök bileşenine eklendi. Bunun için teknik bir neden yok. Sadece daha fazla bakım gerektirdiğini düşünüyorlar. –

1

Genellikle tamamını Uygulamanın tamamında bir küreselSessionService örneği paylaşmak emin olmak için (providers: [] ile değil) bootstrap de SessionService sağlarlar.

bootstrap(AppComponent, 
      [SessionService]); 
+0

@Abdulrahman çok 'önyükleme()' de o sağlayıcıları küresel ancak stil kılavuzuna göre olması gerekiyordu o daha belirgin hale getirir, çünkü küresel sağlayıcıları olmamalı –