我试图在我的LoginService中实现isLoggedIn
类型的布尔值BehaviorSubject
以及getter和setter函数,以将该值作为Observable获取/通过其BehaviorSubject正确设置变量。这是可行的,但是它在TSLint中引发了两个有关“类型不可分配”和“公开标识符”的错误。在没有TSLint抱怨的情况下定义它的正确方法是什么。
这是上述代码的精简版本:
@Injectable()
export class LoginService {
public isLoggedInSource = new BehaviorSubject<boolean>(false);
public isLoggedIn: Observable<boolean> = this.isLoggedInSource.asObservable(); // Duplicate identifier 'isLoggedIn'.
constructor(private http: Http) {}
set isLoggedIn(logged): void { // Duplicate identifier 'isLoggedIn'.
this.isLoggedInSource.next(logged);
}
get isLoggedIn(): Observable<boolean> { // Duplicate identifier 'isLoggedIn'.
return this.isLoggedInSource.asObservable();
}
logout() {
this.isLoggedIn = false; // Type 'boolean' is not assignable to type 'Observable<boolean>'.
}
login(body) {
return this.http.post('/login', body)
.map(res => {
if (res.token) {
this.isLoggedIn = true; // Type 'boolean' is not assignable to type 'Observable<boolean>'.
}
return res;
})
.catch(err => Observable.throw(err););
}
}
使用TypeScript时getter/setter
,必须重命名属性,因此属性名称应与getters/setters
名称不同。
此外,您可以通过将behaviorSubject
服务设置为服务的私有成员来修改代码,而只需公开您的Observable
。
@Injectable()
export class LoginService {
private isLoggedInSource = new BehaviorSubject<boolean>(false);
public _isLoggedIn: Observable<boolean> = this.isLoggedInSource.asObservable();
constructor() {}
set isLoggedIn(logged: boolean) {
this.isLoggedInSource.next(logged);
}
get isLoggedIn() {
return this._isLoggedIn;
}
logout() {
this.isLoggedIn = false;
}
login() {
this.isLoggedIn = true;
}
}
您将能够监听组件中的更改:
export class App {
constructor(private loginService: LoginService) {
loginService.isLoggedIn.subscribe(bool => console.log(bool));
//Wait and simulate a login
setTimeout(() => {
loginService.login();
}, 1200);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句