如果我将服务传递到我的main.ts,我可以在任何地方访问它,而无需在我的子组件中调用新的提供程序。在那项服务中,我有变化的变量。
将这些变量发送到每个子组件,孙组件,..或者只是调用组件中的服务以在需要时获取这些变量会更好吗?
答案 0 :(得分:9)
所以,我认为共享服务是 Rxjs 库的一个很好的解决方案。您可以通过将其注入bootstrap函数来创建服务单例。
答案 1 :(得分:5)
@Input
和@Output
装饰器主要是分别从父子和子父级共享数据 - 嵌套组件。
使用共享服务和RxJS,非嵌套组件也可以订阅该属性,并在更改时相应地执行操作。下面是从应用程序中的任何位置调用this.myService.update()
方法时发出新值的简单示例:
// myservice.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class MyService {
wat$: Subject<any>;
constructor() {
this.wat$ = new Subject();
}
update() {
this.wat$.next(new Date().getTime());
}
}
然后依赖该服务的组件可以订阅并执行。
// mycomponent.ts
export class MyComponent {
constructor(private myService: MyService) {
this.myService.wat$.subscribe((value) => {
// do something with the new value
});
}
}
答案 2 :(得分:5)
如果我正确理解了这个问题,我们可能还需要考虑与这些决定相关的2个不同方面。
@ Input / @ Output - 帮助您的组件独立,不与任何特定服务绑定。假设它是纯组件,它完全依赖于接收的输入来产生输出;它是确定的,易于测试的,非常松散地耦合到应用程序的其他部分;因此,鼓励并且很容易实现高可重用性。
更改变量数据 - UI状态管理至关重要,可能是Angular 2应用程序的核心,直到我理解为止。 ngrx/store是Reactive世界中的Redux并且做得很好。通过这种方式,我们可以保持数据转换的可预测性,可测试性,并且可以根据需要随时通过任何服务/容器组件返回数据,并且可以在组件链中传递。