更改根模块之间的共享数据

时间:2016-09-25 11:28:54

标签: angular

我有两个模块:

第一

@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有一些道具'paramd',我想通过模块观看更改

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

在模块的两个组件(第1和第2)中,我有

private ds: DumyService

在构造函数中。

然后,假设我在第一个模块组件的某个组件中有一些onclick方法,它会发生变化

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

我想在两个模块中进行此更改。 我该怎么处理?

1 个答案:

答案 0 :(得分:3)

有几个类似的问题可以帮助你

主要思想是创建Select branchid,screenid,'People' as screencapacity from screen where (screenid = 'S1' or SCREENID='S3') AND(BRANCHID = 'B1' OR BRANCHID='B4') 的实例,并在引导两个组件时将其用作SharedService

extraProviders

<强> Plunker Example

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

var sharedService = new SharedService();

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

<强> Plunker Example

有重要的事情(如@Günter所说)

  

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

这就是我在上面的例子中使用var platform = platformBrowserDynamic([SharedService]); platform.bootstrapModule(AppModule) platform.bootstrapModule(AppModule2) 的原因。

但我想展示一个技巧。我们“可以使用已知cd.detectChanges()”来引导模块。这样我们就不用担心Zone的召唤了。这两个应用程序都可以在一个detectChanges中使用:

Zone

<强> Plunker Example

希望它有所帮助!