2016-09-25 74 views
3

我有两个模块:改变根模块之间共享数据

第一:

@NgModule({ 
    imports: [ 
     BrowserModule, 
     FormsModule, 

     SharedModule.forRoot() 
    ], 
    declarations: [ 
     FirstComponent 
    ], 
    bootstrap: [ FirstComponent ] 
}) 

export class AppModule { } 

第二:

@NgModule({ 
    imports: [ 
     BrowserModule, 
     FormsModule, 

     SharedModule.forRoot() 
    ], 
    declarations: [ 
     ScndComponent 
    ], 
    bootstrap: [ ScndComponent ] 
}) 

export class AppModule { } 

,并用静态.forRoot()共享模块

@NgModule({}) 
export class SharedModule { 
    static forRoot() { 
     return { 
      ngModule : SharedModule, 
      providers : [DumyService] 
     } 
    } 
} 

我的DumyServise有一些道具'p aramd”,我想通过模块观看变化

@Injectable() 
export class DumyService { 
    paramd : string; 
} 

模块(第一和第二)的两个组成部分我有构造

private ds: DumyService 

然后,让我们说我有一些的onclick方法在第一模块组件的某些成分,改变

clickToChangeParam() { 
     this.ds.paramd = 'new value'; 
} 

而且我希望有这改变了这两个模块。 我该如何处理?

+0

为什么你想要2个根模块? –

+0

因为我需要在应用程序的不同dom部分中使用单独的模块。 我知道,我怎样才能运行它没有一些组件指令 WebArtisan

+0

在angular1中更容易有标记的根组件。在A2中我看不到这种可能性。 A2只能通过自定义指令运行。我错了吗? – WebArtisan

回答

3

有几个类似的问题,这将有助于你

主要的想法是创建SharedService一个实例,并使用它作为extraProviders当引导两个组件。

var sharedService = new SharedService(); 

platformBrowserDynamic([{ provide: SharedService, useValue: sharedService }]).bootstrapModule(AppModule) 
platformBrowserDynamic([{ provide: SharedService, useValue: sharedService }]).bootstrapModule(AppModule2) 

Plunker Example

也许最好的方法是使用平台的一个实例:

var platform = platformBrowserDynamic([SharedService]); 
platform.bootstrapModule(AppModule) 
platform.bootstrapModule(AppModule2) 

Plunker Example

有重要的事情(如@君特称)

当订阅应用程序 从另一个Angular应用程序接收到新值时,需要调用更改检测,因为此 代码在发送应用程序的区域中调用。

这就是为什么我在上面的例子中使用cd.detectChanges()

但我想展示一个技巧。我们“可以使用已知的Zone引导模块”。这样我们就不用担心detectChanges的问题。这两个应用程序将一个Zone内工作:

const platform = platformBrowserDynamic([SharedService]); 
platform.bootstrapModule(AppModule).then((moduleRef: NgModuleRef<any>) => { 
    const zone = moduleRef.injector.get(NgZone); 
    (<any>platform)._bootstrapModuleWithZone(AppModule2, [], zone); // private method is bad!!! 
}); 

Plunker Example

希望它可以帮助天晓得!