我有一项维护上下文属性
的服务@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?或者还有其他优雅/更好的方式吗?
答案 0 :(得分:1)
我经常使用BehaviorSubject
来提供这种服务:
export class MyService {
private contextSubject = new BehaviorSubject<any>(null);
context$ = this.contextSubject.asObservable();
get context() {
return this.contextSubject.value;
}
...
}
您可以使用context
或context$
,具体取决于您的需求。