2017-05-30 66 views
1

我正在構建一個簡單的角度應用程序,我希望服務能夠保持某種狀態。我第一次嘗試這只是一個布爾登錄。基本上,我想要一個navbar組件來訂閱這個值,這樣當它的false顯示一個'login'選項並且它的true顯示一個'admin'按鈕時。只能調用一次的可觀察訂閱方法

我的服務:

@Injectable() 
export class AuthService { 
    private _loggedIn = new BehaviorSubject(false); 
    public readonly loggedIn$ = this._loggedIn.asObservable(); 

    constructor(private http: Http, private router: Router) { 
    this._loggedIn = new BehaviorSubject(false); 
    } 

    public login(u: User): Observable<any> { 
    let obs = this.http.post(ApiRoutes.login, u).map(res => res.json()); 

    obs.subscribe(res => { 
     this._loggedIn.next(res.success); 

     if (this._loggedIn.getValue()) 
     this.router.navigate(['/admin']); 
    }); 

    return obs; 
    } 
} 

在我的導航組件:

@Component({ 
    selector: 'app-nav', 
    templateUrl: './nav.component.html', 
    styleUrls: ['./nav.component.scss'], 
    providers: [AuthService] 
}) 
export class NavComponent implements OnInit { 
    loggedIn: boolean; 

    constructor(private as: AuthService) { } 

    ngOnInit() { 
    this.as.loggedIn$.subscribe(isLoggedIn => { 
     this.loggedIn = isLoggedIn; 
     console.log('from nav ' + isLoggedIn); 
    }, err => { 
     console.log(err); 
    },() => { 
     console.log('complete'); 
    }); 
    } 

} 

現在我看到控制檯輸出,當應用程序啓動而不是登錄後的回報。爲什麼nav組件中的訂閱功能只被調用一次(頁面導航到/ admin,所以我知道服務中的訂閱正在被調用)?這是否與熱/冷觀測值有關?我嘗試過使用諸如.publishLast()。refCount()之類的東西,但無濟於事。

回答

4

您在NavComponent的提供者中添加了AuthService。因此,它具有自己的特定AuthService實例,與您的身份驗證組件使用的實例不同。

該服務必須是單身人士,由應用程序中的所有組件共享。所以它應該在根NgModule的提供者中聲明,而不是其他地方。

+0

是的。這似乎是全部。我想我已經添加了這樣的提供者,因爲它似乎擺脫了關於無法解析服務的構造函數參數的ts錯誤。方便地,我沒有再看到這個錯誤了。哦,學到了新的東西。謝謝! – eatinasandwich