Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 为什么factory resolver只工作一次?_Angular - Fatal编程技术网

Angular 为什么factory resolver只工作一次?

Angular 为什么factory resolver只工作一次?,angular,Angular,我有一个对话框模块,它定义了一个工厂: @NgModule({ declarations: [...components, ...directives], imports: [...modules], providers: [ CustomBlockService, { provide: DocumentCustomBlock, useFactory: (httpClient: HttpCli

我有一个对话框模块,它定义了一个工厂:

@NgModule({
    declarations: [...components, ...directives],
    imports: [...modules],
    providers: [
        CustomBlockService,
        {
            provide: DocumentCustomBlock,
            useFactory: (httpClient: HttpClient, customBlockService: CustomBlockService) => {
                console.log(customBlockService.type);
                switch (customBlockService.type) {
                    case 'doc_num_date_block':
                        return new DocNumDateBlock(
                            httpClient,
                            customBlockService,
                            new DocNumDateBlockFormGroup(createFormControls(customBlockService.value)),
                        );
                    case 'find_unom_by_address_block':
                        return new FindUnomAddressBlock(
                            httpClient,
                            customBlockService,
                            new FindUnomAddressBlockFormGroup(createFormControls(customBlockService.value)),
                        );
                    default:
                        throw 'Error type custom block!';
                }
            },
            deps: [HttpClient, CustomBlockService],
        },
    ],
    entryComponents: [...components],
})
export class DialogLoadDocumentModule {}
对话框的此模块从父组件弹出,在窗口打开之前,所选块将添加到CustomBlockService:

public setDocument(): void {
   this.customBlockService.block = this.block;
}
第一次工作时,我在对话框中看到所选数据
this.customBlockService.block=this.block位于
文档CustomBlock
提供程序中

当窗口关闭并使用新的
this.customBlockService.block=this.block重新打开时然后我在服务中看到旧数据

因此,如果要使用控制台:

useFactory: (httpClient: HttpClient, customBlockService: CustomBlockService) => {
         console.log(customBlockService.type);
});
我注意到,尽管
CustomBlockService
中的属性已被更改,但console只在第一次工作,然后就不工作了

我试图补充这一点:

  { provide: CustomBlockService, useClass: CustomBlockService },

每次加载模块时,在同一模块中创建新实例
CustomBlockService
。但是没有成功。

服务是在此模块级别声明的,并且模块没有多次加载。如果要删除服务类,只需将其设置为对话框最顶部组件上的提供者。这样,当组件离开dom时,服务也随之消亡

另外,请确保通过Ngondestory清除服务中的所有订阅


对于服务生命周期有一个不错的答案,这可能是一个很好的参考。

您能否分享一个如何修改我的提供程序或创建新的提供程序的示例?提供程序数组是一个属性,可以提供给模块和组件。当您将服务提供给组件时,它将导致服务在组件创建/实例化时激活,在组件死亡时死亡。模块的行为是相同的,但模块不只是“消失”。如果您希望多个模块或组件中的同一服务具有不同的数据,或者希望服务数据在组件销毁之前一直存在,则在较低级别提供提供提供程序阵列非常有用。您的问题与提供程序阵列本身(定义工厂的地方)关系不大更重要的是定义服务的位置(哪个提供程序数组)。另外值得注意的是,如果您的服务在顶部有“injectable{providedIn:'root'}”,那么它将在“app module”中有效地定义。如果你有这个,把它改成“Injectable()”我想我明白了。您希望从父组件派生数据,然后子组件使用它。我想问的是,为什么不只是将输入参数传递给组件,而是您可以做一些事情,只要您执行逻辑来显示模式,您就可以执行类似“myService.initialize('mydata1',foo,bar,等等)”之类的操作然后做任何你想做的事情来设置服务数据。。。providedIn:根目录。。。只需执行特定的服务调用即可管理服务中的数据