【问题标题】:Watch for changes in service and update component in angular2, typescript在 angular2、typescript 中观察服务和更新组件的变化
【发布时间】:2016-08-22 07:42:01
【问题描述】:

我有一个组件和一个服务。每当我的服务中的布尔属性发生更改时,我想通知我的组件。我想我应该使用 rxjs 中的 Observable 和 Observer。

我制作了未按预期工作的服务和组件。

AppComponent.ts

import {  Component } from '@angular/core';
import { UserData } from 'user-data.service';
@Component({
    selector: 'app',
    templateUrl: '<div></div>'
})
export class AppComponent {
    isLoggedIn: boolean;
    constructor(public userData: UserData) {
       userData.isLoggedIn.subscribe(isLoggedIn => {
           this.isLoggedIn = isLoggedIn;
       });//???
    }
    ???
}

UserDataService.ts

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';

@Injectable()
export class UserData {
    isLoggedIn: Observable<boolean>; // ???
    observer: Observer<boolean>; // ??? giving an error in tsc (Type 'Observer' is not generic)
    constructor() {
        this.isLoggedIn = new Observable(observer => 
           this.observer = observer
        ).share(); ///???
    }
    changeLoginStatus (isLoggedIn: boolean) { // function called from login/logout actions
        this.observer.next(isLoggedIn); // ??? not sure
    }

}

【问题讨论】:

    标签: angular typescript rxjs observable


    【解决方案1】:

    最简单的方法是使用带有初始值的BehaviorSubject

    export class UserData {
      isLoggedIn: Subject<bool> = new BehaviorSubject(false);
      changeLoginStatus (isLoggedIn: boolean) { 
        this.isLoggedIn.next(isLoggedIn); // ??? not sure
      } 
    }
    

    另见https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

    正如@KonradGarus 建议的那样,Subject 应该保密。

    export class UserData {
      private isLoggedIn: Subject<bool> = new BehaviorSubject(false);
      isLoggedIn$ = this.isLoggedIn.asObservable();
      changeLoginStatus (isLoggedIn: boolean) { 
        this.isLoggedIn.next(isLoggedIn); 
      } 
    }
    

    上面链接的食谱还包含一个完整的示例,其中Subject 是保密的。

    【讨论】:

    • 下一个方法是 Observer 类型而不是 Observable
    • 抱歉,请将类型改为Subject
    • 当我尝试使用 new BehaviorSubject(false);我在 rxjs 上得到 404 。 localhost:8080/node_modules/rxjs 404(未找到)。但我可以使用 rxjs 中的“主题”。从'rxjs'导入{ BehaviorSubject};从 'rxjs/Subject' 导入 { Subject} 时抛出错误;作品。有什么想法吗??
    • BehaviorSubject 绝对存在。不知道出了什么问题。您也可以使用SubjectBehaviorSubject 的优点是,新订阅者立即获得最后发出的值。使用Subject,如果组件在事件发出后订阅,则在发出另一个事件之前它不会获得任何状态。这并不总是很糟糕,但BehaviorSubject 有时很方便。
    • 虽然我们这样做了,但通常的建议是公开 Observable 并保持 Subject 私有。
    猜你喜欢
    • 2016-09-25
    • 2017-05-07
    • 2018-06-09
    • 2015-12-17
    • 2022-12-15
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多