【问题标题】:Using service data in component's template - is it a good practice?在组件的模板中使用服务数据 - 这是一个好习惯吗?
【发布时间】:2017-07-25 07:44:46
【问题描述】:

我将服务注入组件。该服务是某种数据寄存器——所有需要的组件数据都在那里。

在组件的模板中使用该服务数据是一种好习惯吗?还是我应该写多个 Observable?

示例:

<my-comp [page]="myService.page" [pageSize]="myService.pageSize"></my-comp>

组件始终绑定到特定服务,不应在其他地方使用。

编辑:另一种方法是在服务中定义新的主题并在组件中订阅它们:

page = new Subject<number>();pageSize = new Subject<number>();

ngOnInit() {
    this.page=this.myService.page.subscribe(page=>this.page=page);
    this.pageSize=this.myService.pageSize.subscribe(pageSize=>this.pageSize=pageSize);
}

我认为有很多不需要的代码。

【问题讨论】:

  • 你还有什么其他想法?
  • 除非我弄错了,否则对myService.page 的更改将不会被接收。你最好从服务中发布一个 observable,然后写 myService.page | async。就个人而言,我更愿意在组件的ngOnInit中创建一个这个副本,比如this.page = this.myService.page,然后在模板中引用它为page | async
  • @NikhilRadadiya 帖子已编辑。
  • @torazaburo 更改被拾取。
  • @piernik 我认为第二个更好

标签: angular


【解决方案1】:

这是主观的,但这是从性能的角度来看的。你现在使用的方式会生成如下updateDirectives函数:

function (_ck, _v) {
    var _co = _v.component;
    var currVal_0 = _co.myService.page;
    var currVal_1 = _co.myService.pageSize;
    ...
    _ck(_v, 1, 0, currVal_0, currVal_1, ...);
},

如您所见,每个更改检测周期都会查询这些值。更高效的方法是向子组件提供此服务并在 ngOnInit 中设置 observables:

class MyComp {
    const cancelSubscription = new Subject();
    ngOnInit() {
       this.service.page.takeUntil(cancelSubscription).subscribe((v)=>this.page=v)
       this.service.pageSize.takeUntil(cancelSubscription).subscribe((v)=>this.pageSize=v)
       ...
    }

    ngOnDestroy() {
       this.cancelSubscription.next();
       this.cancelSubscription.complete();

这样编译器生成的函数会是这样的:

function (_ck, _v) {
    var _co = _v.component;
    var currVal_0 = _co.myService;
    _ck(_v, 1, 0, currVal_0);
},

这将仅通过参考执行一次快速比较。

更好的方法是使用 DI。在父组件中定义一个服务,注入到MyComp

@Component({providers:[Service]})
class ParentComponent
    constructor(private s: Service) {}
    ...
    s.page.next(3)

class MyComp {
    constructor(private s: Service) {}

    ngOnInit() {
      ...

所以组件会这样使用:

<my-comp></my-comp>

这样udpateDirectives函数就不会被编译器生成了。

【讨论】:

  • 是的,但是您的subscribe 方法将要求订阅者也被ngOnDestroy 拆除。是否有理由不使用async 订阅模板?
  • @torazaburo,是的,没错,我将添加此信息。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多