2016-10-07 3 views
2

내 LoginService isLoggedIn 부울 값을 BehaviorSubject getter 및 setter 함수를 함께 Observable로 값을 얻으려면/해당 변수를 통해 올바르게 설정하려면 노력하고있어/행동 과제. 이것은 작동하지만 TSLint에서는 "유형을 할당 할 수 없습니다"및 "Dublicate 식별자"에 대해 두 가지 오류가 발생합니다. TSLint가 그것을 불평하지 않고 정의하는 올바른 방법은 무엇입니까?getter 및 setter 각도 2로 구현하는 방법 BehaviorSubject

이것은 위에서 언급 한 코드의 버전을 박탈입니다 : 당신이 타이프 라이터 getter/setter를 사용하는 경우

@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

또한 ... 공공 장소에 대한 getter/setter가있는 점은 실제로 없습니다. 어쨌든 수업을 사용하는 사용자는 주변을 둘러 볼 수 있습니다. – toskv

답변

5

, 당신은 당신의 재산의 이름을 변경해야하므로 속성 이름이 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()'와 같은 것을 보낼 수 없다. 아키텍처를 두 부분으로 나눠야합니다 : ** 데이터 생성 흐름 ** 및 ** 데이터 저장소 **. 이 [post] (https://stackoverflow.com/questions/41827371/how-do-i-throw-an-error-on-a-behaviour-subject-and-continue-the-stream)를 참조하십시오. –