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

Why is a singleton service instantiated on every route change and not only once in Angular 6?

我有一个定义如下的服务:

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');
  }
}

据我了解,此服务在整个 运行 应用期间应该是单例的。

现在,当页面刷新时,它会正确记录“已调用数据服务构造函数”。

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

我是不是漏掉了什么?

providedIn: 'root'表示只会实例化一次,所有依赖请求都会提供同一个实例。如果您不止一次看到构造函数 运行,那么您是在其他地方提供它。搜索您提供它的位置,因为 providedIn: 'root' 不需要在提供列表中列出。搜索 "provides : [" 并查看提供 MyDataService 的内容并将其删除。如果您使用的是 VS Code,您可以右键单击 class 名称并 select 查找所有引用并查看它在提供数组中的位置。