Angular服务实例化两次?

时间:2017-11-16 11:36:22

标签: javascript angular ng-bootstrap

不知怎的,我有一个似乎被实例化两次的服务(它的属性不同步),通过执​​行以下操作:

List<string> someList = new List<string>{"1-30","20-100","21-23","34-80"};
List<string> newList = new List<string>();
foreach (var v in someList)
     {
        string[] s = v.Split('-');
        newList.Add(s[0]);
     }

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

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

任何人都知道为什么会这样?

提前致谢。

此致 丹尼斯

5 个答案:

答案 0 :(得分:2)

在我的情况下,该服务实例化了两次,因为我使用两种不同的方法导入了该服务(我的IDE(VS2019)通过自动生成不正确的导入而在这里给我带来了误解):

import { Service } from '@mycompany/mymodule' 

import { Service } from '../../../dist/@mycompany/mymodule/@mycompany-mymodule';

答案 1 :(得分:1)

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

platformBrowserDynamic()
  .bootstrapModule(AppModule)

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

export class AppModule {}

source

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

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

source

答案 2 :(得分:0)

这取决于您为服务声明提供程序的位置 - 这决定了作用域。您没有在问题中指明您已经完成此操作 - 例如,尝试在AppModule中执行此操作。

答案 3 :(得分:0)

&#34;服务&#34;必须是Service2的公共财产。

@Injectable
export class Service2 {
  service:Service
  constructor(service: Service) 
  {
      this.service=service;
  }
}

答案 4 :(得分:0)

可视代码以这种方式自动导入我的服务

import { ConfigService } from 'src/app/services/config.services.js';

正确的方法是:

import { ConfigService } from 'src/app/services/config.services';