我今天刚刚将我的应用程序切换为延迟加载.
我有一个导出一堆服务的SharedModule.
在我的AppModule中,我导入SharedModule,因为AppComponent需要访问一些共享服务.

在另一个模块FinalReturnModule中,我导入了SharedModule.在我的一个服务中,我在构造函数中放了一个console.log(‘hi’).

当应用程序首次加载时,我开心到控制台.每当我导航到FinalReturnModule中的页面时,我再次开心.显然,由于有两个实例,因为模块无法通信,所以没有任何工作正常.

如何阻止服务实例化两次?

编辑:背景,该应用程序使用angular-cli构建.

当前版本:

angular-cli: 1.0.0-beta.24
node: 6.9.1
os: win32 ia32
@angular/common: 2.4.1
@angular/compiler: 2.4.1
@angular/core: 2.4.1
@angular/forms: 2.4.1
@angular/http: 2.4.1
@angular/platform-browser: 2.4.1
@angular/platform-browser-dynamic: 2.4.1
@angular/router: 3.1.1
@angular/compiler-cli: 2.4.1
如果该服务确实是一个单例(一个创建一个),请不要将它添加到任何将作为延迟加载模块的一部分的模块中(例如在SharedModule中).原因是延迟加载的模块获得自己的服务实例.如果您希望服务真正是一个单独的服务,那么只需将它添加到AppModule,或者只将其导入到AppModule的“核心模块”.或者您可以使用仅在AppModule中调用的forRoot
import { ModuleWithProviders } from '@angular/core';

@NgModule({
  declarations: [...],imports: [...]
})
class SharedModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,providers: [ MySingletonService ]
    }
  }
}

@NgModule({
  imports: [ SharedModule.forRoot() ]
})
class AppModule {}

@NgModule({
  imports: [ SharedModule ]
})
class OtherModule {}

现在,AppModule是唯一一个使用提供程序导入模块的模块.

也可以看看:

> Docs on Modules.所有这些都在那里解释.

Angular2延迟加载服务被实例化两次的更多相关文章

  1. ios – 实例化ViewController w / xib时的帧大小不正确

    我有一个视图控制器,看起来像:当我通过让spotViewController=SpotViewController实例化视图控制器并将其推送到导航控制器时,结果框架在viewDidLoad和viewWillAppear中都是不正确的.它给了我这是界面构建器中的大小.为什么会发生这种情况以及使用xib实例化视图控制器以确保帧正确的正确方法是什么?解决方法这将解决您的问题,UIViewController从xib加载,在viewDidLoad期间保持xib大小:

  2. ios – 如何在从SlideMenuViewController实例化的ViewControllers中打开TabBarController

    我希望在所有ViewControllers中都有tabBar.我已经实现了SWRevealViewController,它有两个链接的视图控制器,一个是TabBarController,另一个是TableViewController我希望在我的所有ViewControllers中都有与TableViewController相同的tabBar.解决方法IwanttohavetabBarinallmy

  3. ios – SKLabelNode延迟应用程序启动

    目前我正在使用SpriteKit编写一个小应用程序,它工作得非常好,但唯一的问题是SKLabelNode,我使用以下正常代码初始化:还有很多东西可以初始化,但它们不会影响任何东西.如果我注释掉上面的代码,应用程序会在平时加载.使用SKLabelNode,它可以将负载延迟几秒钟……

  4. ios – 无法实例化名为ADBannerView的类

    我试图在我的应用程序的底部插入一个iad横幅,但在遵循教程后不断收到错误.代码如下.我一直收到以下错误*由于未捕获的异常’NSInvalidUnarchiveOperationException’终止应用程序,原因:’无法实例化名为ADBannerView的类’*第一次抛出调用堆栈:解决方法请确保您已添加“iAd.framework”…要执行此操作,请转到“App.Target”,“General

  5. ios – 通过AppDelegate以Storyboard方式实例化View Controller

    我正在建立一个应用程序–当第一次启动它时,它要求用户做两件事情:>选择国家>接受T&Cs从那里到家庭视图控制器.我目前面临的问题是将第一个视图控制器从我的应用程序代理推送到屏幕上.我正在使用storyboards/Xcode5/iOS7这是我提出的代码:问题是应用程序崩溃时遇到以下错误的最后一行代码:*Terminatingappduetouncaughtexception‘NSinvalidar

  6. ios – 使用UINavigationController的initWithNavigationBarClass的正确方法:toolbarClass:

    从苹果文档我知道一个UiNavigationController可以使用另一个Uinavigationbar使用initWithNavigationBarClass:toolbarClass:方法实例化.如何通过定制的UiNavigationBar子类和IB正确地执行此操作?解决方法您可以像这样使用它来初始化导航控制器,这里CustomNavigationBar是通过子类化UINavigation

  7. swift - singleton

    关于单例,有三个重要的准则需要牢记:单例必须是唯一的,在程序生命周期中只能存在一个这样的实例。单例的存在使我们可以全局访问状态。为保证单例的唯一性,单例类的初始化方法必须是私有的。这样就可以避免其他对象通过单例类创建额外的实例。通过调用dispatch_once,即可保证实例化代码只运行一次。

  8. Swift延迟加载的一种用途

    不可以在默认属性中来完成吗?本猫想了一会,于是有了如下代码:不幸的是,以上代码不能正确运行,因为其中的self并没有代表ViewController的实例对象.所以此路不通.所幸的是Swift为我们提供了一种延时加载属性的机制,我们可以这样写:很好很强大!需要注意的是lazy修饰的属性初始化代码只会被运行一次,无论你访问该属性多少次!

  9. 用字符串动态创建类并赋值

    在开发中有时候会遇到用一个不确定的类实例化对象,即用字符串转换成类,并实例化对象和赋值;比如一个界面的跳转要有后台来控制,就可以用这种方式。下面简单记录下这个转换过程:然后通过一个字符串来实例化一个对象:到此就创建完一个对象并给对象的属性赋值。

  10. swift中的默认初始化程序

    )的swift类,并在不同的swift文件中实例化了类,并得到了一个编译错误。我仔细检查了行为,即使在swift文档中给出的类定义,这种行为也是一致的:摘录自:苹果公司“Swift编程语言”iBooks。https://itun.es/in/jEUH0.l如果varitem=ShoppingListItem()在appDelegate.swift中完成,从函数应用程序:didFinishLaunchingWithOptions我们得到错误:OTOH,如果我们在课堂宣言结束之后保留实例化,没有问题。

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部