如何在Angular 2中使用getter和setter实现BehaviorSubject

马塞洛·迪·西蒙妮

我试图在我的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在抽象类中使用getter和setter

如何在getter和setter中使用Enums?

如何在JavaScript中使用setter和getter,遇到错误

如何在 Ruby 中使用 getter 和 setter?

如何在 Kotlin 中使用 Getter 和 Setter?

如何在Angular中创建Getter Setter

如何同时使用String和int实现setter和getter?

如何在Angular 2中使用canReuse和routerOnReuse

如何在Angular 2中使用Scrollspy和Affix

Angular 2 Setter和Getter

如何在Android中使用setter和getter存储全局变量?

如何使用setter和getter函数实现线程安全类,而使用setter的频率要比getter高得多

如何在Angular 4中组件的HTML模板中的服务中使用BehaviorSubject类?

如何在webpack 2和typescript和angular 2中使用摇树?

如何在 angular 2 中使用 jQuery .on() 和 .off() 的方式?

如何在Jsfiddle中使用Angular2和Typescript

Kotlin:如何在不使用getter和setter的情况下在ViewModel中更改MutableLiveData的值

如何在Angular 6中使用mouseover和mouseout

如何使用自定义类对象正确实现 lateinit 以在 android 中的 onCreate() 中使用,避免“属性 getter 或 setter 预期”错误

如何在Android Studio中自动生成getter和setter

如何在VSCode中为Typescript生成Getter和Setter

如何在 JS 中动态生成 getter 和 setter?

如何在vscode中为flutter生成getter和setter?

如何在Ionic 2中使用angular 2服务?

如何在Angular 8中使用angular-oauth2-oidc实现身份验证代码流

如何在Angular 2中使用窗口对象?

如何在Angular2中使用<html>模板?

如何在Angular 2中使用“ /:params”获取参数

如何在Angular 2中使用jQuery?