为什么在每个路线更改时实例化单例服务,而在Angular 6中不仅实例化一次?

时间:2019-02-07 22:34:57

标签: javascript angular angular6 angular-services

我有这样定义的服务:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of, Subscription, combineLatest } from 'rxjs';
import { map, catchError, retry } from 'rxjs/operators';

@Injectable({
  providedIn: 'root',
})

export class MyDataService {
  constructor(private http: HttpClient) {
    console.log('Called MyDataService constructor');
  }
}

据我了解,此服务在应用程序的整个运行过程中应该是单例的。

现在,页面刷新时,它会正确记录“ 被称为DataService构造函数”。

不幸的是,当我导航到另一个页面(带有延迟加载模块的新路由)时,构造函数再次运行,并且每次路由更改时都会记录“ Called DataService构造函数”。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

providedIn:'root'意味着它将仅被实例化一次,并且将向所有依赖项请求提供相同的实例。如果看到构造函数运行不止一次,则可以在其他地方提供它。按照providerIn搜索要提供它的位置:无需在提供列表中列出“ root”。搜索“ provides:[”,然后查看提供MyDataService的内容并将其删除。如果您使用的是VS Code,则可以右键单击类名,然后选择“找到所有引用”,然后查看它在Provides数组中的位置。