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

3
我的服务定义如下:
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”。
不幸的是,当我导航到另一个页面(使用延迟加载模块的新路由)时,构造函数再次运行,并在每个路由更改时记录“Called DataService constructor”。 我错过了什么吗?

1
你在其他组件或模块中是否已经注册了该服务(在“providers”数组中定义)? - undefined
它应该(或可以)是一个单例。这取决于您如何提供服务。如果当前不是,您应该查看您的模块和导入,并确保您的服务也具有 providedInRoot: true 设置。 - undefined
@DeborahK 非常感谢您。它仍然是在另一个组件中提供的。现在它按预期工作。也许这对将来的某个人有所帮助,因为它可能是一个陷阱。 :) - undefined
1个回答

2
providedIn: 'root' 意味着它只会被实例化一次,并且相同的实例将提供给所有依赖请求。如果您看到构造函数运行多次,则说明您在其他地方提供了它。查找“提供:[]”并查看谁提供了MyDataService,然后将其删除,因为providedIn: 'root'不需要列在提供列表中。如果您使用VS Code,可以右键单击类名并选择查找所有引用,查看它在提供数组中的位置。Original Answer翻译成"最初的回答"。

补充一下这个答案...你可以在这里的文档中找到更多关于单例模式的内容:https://angular.io/guide/singleton-services - undefined
1
非常感谢。那就是问题所在。它也意外地提供给了另一个组件。我希望这对未来的某个人也有所帮助。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接