2016-10-07 4 views
2

Я пытаюсь реализовать в моем LoginService a isLoggedIn логическое значение типа BehaviorSubject вместе с функциями getter и setter, чтобы получить значение в качестве наблюдаемого/правильно установить переменную через его BehaviorSubject. Это работает, однако он вызывает две ошибки в TSLint о «Тип не назначаемый» и «Идентификатор сублицензии». Каким будет правильный способ определить его без жалобы TSLint.Как реализовать BehaviorSubject с getter и setter в Angular 2

Это урезанная версия указанной выше кода:

@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);); 
    } 
} 
+2

использовать разные имена для свойства и геттер/сеттеры. – toskv

+0

также ... на самом деле нет смысла иметь геттер/сеттер для публичного имущества. В любом случае пользователи вашего класса смогут обойти их. – toskv

ответ

5

При использовании машинописи 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); 

    } 
} 
+0

Как бы вы решали обработку ошибок с использованием этого шаблона? – martinoss

+0

Вы можете обрабатывать свои ошибки на уровне обслуживания. Но вы не можете отправить что-то вроде 'new Error()' в поток темы, потому что это убьет его. Вы должны разделить свою архитектуру на две части: поток ** генерации данных ** и ** хранилище данных **. Вы можете обратиться к этому [сообщению] (https://stackoverflow.com/questions/41827371/how-do-throw-an-error-on-a-behaviour-subject-and-continue-the-stream) –

Смежные вопросы