角度2 - 绑定与订阅

时间:2017-05-22 12:17:40

标签: angular rxjs

我有一项维护上下文属性

的服务
@Injectable()
export class MyService {
    constructor(private _http: Http) {}

  // a variable/getter in service that holds context
  _currentContext: any;
  get currentContext() { return this._currentContext;}

  // a method in service that fetches context
  fetchContext() {
    return this._http.get(`/api/xxx`).map(response => response.json());
}

现在组件可以注入此服务,组件模板中的元素可以直接绑定到上下文。每当上下文发生变化时,这些绑定都会作为更改检测的一部分进行更新。

如果我想在上下文发生变化时在组件中运行一些逻辑怎么办?

@Component({
    selector: 'my-cmp',
    template: `<div *ngIf="_myService.currentContext` >asdf</div>
 })
export class MyComponent{
    constructor(private _myService: MyService) {}

    //doSomethingOnContextChange(){}
}

我相信答案是在我的服务中创建/维护 Observable ,然后我的组件订阅该observable。

 _currentContextObservable= new Subject<any>();
 get currentContextObservable(): Observable<any> { return this._currentContextObservable; }

那么,对于每个这样的变量,我是否需要维护一个变量/ getter和一个subject / observable?或者还有其他优雅/更好的方式吗?

1 个答案:

答案 0 :(得分:1)

我经常使用BehaviorSubject来提供这种服务:

export class MyService {
    private contextSubject = new BehaviorSubject<any>(null);
    context$ = this.contextSubject.asObservable();

    get context() {
        return this.contextSubject.value;
    }

    ...
}

您可以使用contextcontext$,具体取决于您的需求。

相关问题