【问题标题】:Angular library using forRoot使用 forRoot 的 Angular 库
【发布时间】:2020-10-30 23:07:21
【问题描述】:

我正在建立一个我希望其他项目使用的库。 我正在尝试将配置文件传递给我这样定义的模块:

@NgModule({
  declarations: [ImageComponent],
  imports: [CommonModule],
})
export class ImagesModule {
  static forRoot(config: ImagesConfig): ModuleWithProviders<ImagesModule> {
    return {
      ngModule: ImagesModule,
      providers: [{ provide: ImagesConfig, useValue: config }],
    };
  }
}

export class ImagesConfig {
  cloudName: string;
}

这看起来不错,但现在我想在实际模块中使用 cloudName,如下所示:

@NgModule({
  declarations: [ImageComponent],
  imports: [
    CommonModule,

    CloudinaryModule.forRoot(Cloudinary, {
      config.cloudName,
    }),
  ],
})
export class ImagesModule {
  static forRoot(config: ImagesConfig): ModuleWithProviders<ImagesModule> {
    return {
      ngModule: ImagesModule,
      providers: [{ provide: ImagesConfig, useValue: config }],
    };
  }
}

export class ImagesConfig {
  cloudName: string;
}

这可能吗?如果是这样,我该怎么做?


我已经创建了这样的模块:

import { ModuleWithProviders, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ImageComponent } from './image.component';

import { CloudinaryModule } from '@cloudinary/angular-5.x';
import * as Cloudinary from 'cloudinary-core';

import { ImagesConfig } from './images-config';
import { IMAGES_CONFIG } from './images-config.token';

@NgModule({
  declarations: [ImageComponent],
  imports: [CommonModule],
})
export class ImagesModule {
  static forRoot(config: ImagesConfig): ModuleWithProviders<ImagesModule> {
    return {
      ngModule: ImagesModule,
      providers: [
        { provide: IMAGES_CONFIG, useValue: config },
        ...CloudinaryModule.forRoot(Cloudinary, {
          cloud_name: config.cloudName,
        }).providers,
      ],
    };
  }
}

images-config.tsimages-config.token.ts 分别如下所示:

export interface ImagesConfig {
  cloudName: string;
}

import { InjectionToken } from '@angular/core';

export const IMAGES_CONFIG = new InjectionToken('IMAGES_CONFIG');

当我尝试在 public-api.ts 中使用时:

/*
* Public API Surface of situ-angular-components
*/

export * from './lib/images/images-config';


export * from './lib/images/images.module';

一切都可以编译,但如果我尝试构建我的库,我会收到此错误:


不幸的是,@yurzui 提供的答案似乎不起作用。 如果我将我的模块更改为:

@NgModule({
  declarations: [ImageComponent],
  imports: [
    CommonModule,
    CloudinaryModule.forRoot(Cloudinary, { cloud_name: 'demo' }),
  ],
})
export class ImagesModule {}

并建立我的图书馆,它可以工作。 如果我这样做:

@NgModule({
  declarations: [ImageComponent],
  imports: [CommonModule],
})
export class ImagesModule {
  static forRoot(config: ImagesConfig): ModuleWithProviders<ImagesModule> {
    return {
      ngModule: ImagesModule,
      providers: [
        { provide: IMAGES_CONFIG, useValue: config },
        ...CloudinaryModule.forRoot(Cloudinary, {
          cloud_name: config.cloudName,
        }).providers,
      ],
    };
  }
}

当我尝试构建库时,我收到一条错误消息:

如果 'cl-image' 是一个 Angular 组件,则验证它是该模块的一部分。

我在 ImageComponent 中使用 cl-image

【问题讨论】:

    标签: angular angular-library


    【解决方案1】:

    您可以尝试以下方法:

    @NgModule({
      declarations: [ImageComponent],
      imports: [
        CommonModule,
        CloudinaryModule,
      ],
    })
    export class ImagesModule {
      static forRoot(config: ImagesConfig): ModuleWithProviders<ImagesModule> {
        return {
          ngModule: ImagesModule,
          providers: [
            { provide: ImagesConfig, useValue: config },
            ...CloudinaryModule.forRoot(Cloudinary, {
              // pass config.cloudName here,
            }).providers,
          ],
        };
      }
    }
    
    export class ImagesConfig {
      cloudName: string;
    }
    

    【讨论】:

    • 可以编译,但是当我将它添加到 public-api.ts 并尝试构建时,出现错误:无法读取未定义的属性“toString”
    • 你能给我看那个错误的截图吗?你是如何传递 cloudName 的?
    • 看起来这个错误来自 postcss 插件。它不应该与你如何编写 ts 代码有关。至少这是我的期望
    • 奇怪,我不用postcss
    • 想通了 :) 哈哈,它在组件中,它正在寻找一个不存在的样式表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2020-10-06
    • 2018-09-18
    • 2019-08-30
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多