javascript - Angular 服务实例化了两次?

标签 javascript angular ng-bootstrap

通过执行以下操作,我以某种方式获得了似乎被实例化两次的服务(其属性不同步):

@Component
export class MyComponent extends someOtherComponent {
  constructor(service: Service, service2: Service2) {
    super(service, service2);
  }

  isStateEqual() {
    return this.service.serviceState === this.service2.service.serviceState;
  }
}

@Injectable
export class Service {
  serviceState = {}
}

@Injectable
export class Service2 {
  constructor(service: Service) {}
}

这只是一个非常基本的示例,但归根结底就是这样。更准确地说:我们正在构建自己的日期选择器并扩展具有 KeyMapService(使用 NgbDatepickerService)和本地 NgbDatepickerService 的 NgbDatepicker 组件。
这里是组件的链接:https://ng-bootstrap.github.io/#/components/datepicker/examples

在我们的应用程序中,isStateEqual 将始终返回 false(即使在初始化组件之后),而在演示中,您可以在上面的链接中找到它将始终返回 true(它应该是这样)。

有人知道为什么会这样吗?

提前致谢。

问候 丹尼斯

最佳答案

必须在引导模块上定义应用程序范围的单例:

platformBrowserDynamic()
  .bootstrapModule(AppModule)

@NgModule({
  providers: [SingletonService1, SingletonService2],
  bootstrap: [AppComponent]
})

export class AppModule {}

source

或者通过在服务装饰器上设置 providedIn: 'root':

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

source

关于javascript - Angular 服务实例化了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47328660/

相关文章:

javascript - 我无法使用在同一对象内创建的方法来修改对象的属性。我正在尝试使用 foreach 然后 console.log 未定义

html - 如何在 Angular 上明智地为组件 View 制作加载器

html - 如何使用 Angular 5 显示可扩展的动态表格?

html - 如何制作 Bootstrap 下拉菜单的垂直滚动条

模板中的 Angular 6 刷新数组和 ngFor

javascript - jquery 的 if else 语句使用选择器来查看某个 div 是否已附加到它

javascript - AJAX/Javascript 获取提交的表单数据

javascript - 在 Angular 4 中使用数组参数进行路由

javascript - 不使用 angular 中的 javascript 在 div 上设置属性值

html - 如何在 Angular 9 中使用 2 向绑定(bind)