当前位置: 首页 > 知识库问答 >
问题:

尽管使用@Injectable({providedIn:'root'})装饰器,但在组件中注入时角度服务不作为单例

云利
2023-03-14

我有一个项目,其中包含两个模块(默认AppModule和创建项目时由angular cli生成的路由模块)、我创建的两个组件和我注入每个组件的构造函数中的一个服务。我希望有相同的服务实例(每次注入服务时都是单例,因为它有@Injectable({providedIn:'root'})装饰器),但每次导航到每个组件时,我都会得到一个全新的服务实例。下面是我的代码:

app.module.html

\<router-outlet\>\</router-outlet\>

应用程序。单元ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { TestComponent } from './test/test.component';
import { Test2Component } from './test2/test2.component';


@NgModule({
  declarations: [
    AppComponent,
    TestComponent,
    Test2Component
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

应用程序路由。单元ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { TestComponent } from './test/test.component';
import { Test2Component } from './test2/test2.component';

const routes: Routes = [
  { path: 'test1', component: TestComponent },
  { path: 'test2', component: Test2Component }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

测验组成部分ts

import { Component} from '@angular/core';
import { TestService } from '../test.service';

@Component({
  selector: 'app-test',
  templateUrl: './test.component.html',
  styleUrls: ['./test.component.css']
})
export class TestComponent {

  constructor(private _testService: TestService) { }
}

测试2。组成部分ts

import { Component } from '@angular/core';
import { TestService } from '../test.service';

@Component({
  selector: 'app-test2',
  templateUrl: './test2.component.html',
  styleUrls: ['./test2.component.css']
})
export class Test2Component {

  constructor(private _testService: TestService) { }

}

测验服务ts

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class TestService {

  private date = new Date();

  constructor() {
    console.log("Inside the service ", this.date);
  }

}

共有3个答案

胡天佑
2023-03-14

参考以下链接:https://www.w3resource.com/angular/angular-singleton-service.php

您需要在应用程序中注册您的服务。单元ts作为提供者。

providers: [{provide: Service}]
巫培
2023-03-14

在提供者数组中提供测试服务,app.module.ts如下。创建单例
提供程序:[TestService]

乜承嗣
2023-03-14

从代码的外观来看,您的服务确实是单一的。

将此文件插入应用程序。组成部分html,然后尝试以下链接:

<nav>
  <ul>
    <li><a routerLink="child-a">Child A</a></li>
    <li><a routerLink="child-b">Child B</a></li>
  </ul>
</nav>

我怀疑您试图通过在浏览器导航栏中写入url来检查这两个组件,因此您可以在任何时候重新路由时重新加载应用程序。可能是这样吗?

我在这里创建了一个路由和单例服务使用的工作示例。

 类似资料:
  • 我使用下面的数字管道来格式化数量: 示例显示为< code>1,234,0。

  • 用Entry饰器修饰的组件可以作为页面入口组件么 本文参与了 思否 HarmonyOS 技术问答马拉松,欢迎正在阅读的你也加入。

  • 问题内容: 我有一个Java Selenium项目,该项目不会在我的计算机上运行,​​但会在具有相同OS版本(OSX 10.13.1),Chrome浏览器版本(63.0.3239.84)和chromedriver版本(2.34)的同事的计算机上运行。我收到消息: 但是,当我在浏览器中打开http:// localhost:18633 / status时 ,我得到一个有效的响应: 我试过换出chro

  • 问题内容: [免责声明:可能会有更多pythonic方法来做我想做的事,但我想知道python的作用域在这里是如何工作的] 我试图找到一种方法来制作装饰器,该装饰器的作用类似于将名称注入另一个函数的作用域(以使名称不会泄漏到装饰器作用域之外)。例如,如果我有一个函数说要打印一个尚未定义的名为的变量,我想在调用它的装饰器中定义它。这是一个中断的示例: 我希望它打印“ ”,但它给出: 追溯甚至指向wh

  • 问题内容: 我有服务: 但是当我打电话时,我无法访问和获得。因此,对我而言,逻辑上的步骤是为save()提供,因此我还必须将其提供/注入到。因此,如果我这样做: 我收到以下错误: 错误:[$ injector:unpr]未知提供程序:$ scopeProvider <-$ scope <-StudentService 错误中的链接(哇,很干净!)让我知道它与注入器相关,并且可能与js文件的声明顺序

  • 我有一个类似于以下内容的Spring启动配置文件, 我已将角度项目中的构建文件复制粘贴到中。 不知道这有没有关系。下面是我的< code>JwtFilter.java, 我尝试过将这些js构建文件添加到元INF /资源,公共 目录结构为: < li>java/... < li >资源/ < ul > < li >资源/ < ul > < li >元信息/ < ul > < li >资源/[包含角度