Angular6:使用本地库时没有注入器的提供者

Tin*_*adm 8 angular angular6

我对 AngularJS 发布后的 Angular 版本有点陌生,并决定尝试一下。我想要做的是构建一个 UI 组件库,以及一个将使用所述库的应用程序。在我的库中,我决定将组件创建为 WebComponents,所以按照我目前找到的教程,我有类似的东西

import { Injector, NgModule } from '@angular/core'
import { createCustomElement } from '@angular/elements';
import { MyButtonComponent} from './my-button.component'

@NgModule({
    declarations: [MyButtonComponent],
    entryComponents: [MyButtonComponent]
})
export class MyButtonModule {
    constructor(injector: Injector) {
        const myButton = createCustomElement(MyButtonComponent, { injector });
        customElements.define('my-button', myButton);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于我的自定义组件。如果我将组件的所有文件(模块、组件、模板和 SCSS 文件)直接添加到我的应用程序中,它会按预期工作,所以我知道我的组件声明是正确的。但是,如果在我的应用程序中包含库中的组件,则在使用 运行我的应用程序时ng serve,我会看到错误:

Error: StaticInjectorError(AppModule)[MyButtonModule -> Injector]: 
  StaticInjectorError(Platform: core)[MyButtonModule -> Injector]: 
    NullInjectorError: No provider for Injector!
Run Code Online (Sandbox Code Playgroud)

我正在使用 Angular 6,并且我的两个项目都在本地运行,并且我正在使用ng-packagr捆绑我的库。我在我的库中添加了@angular/coreand @angular/elementsaspeerDependencies在我的主应用程序中我必须添加

"resolutions": {
    "@angular/core": "6.1.4"
}
Run Code Online (Sandbox Code Playgroud)

解决错误cannot redeclare block-scoped variable 'ngDevMode'(不确定这是否相关)。最初我认为注入错误可能是由这个引起的,但我已将其添加preserveSymlinks到我的angular.json文件中,但仍然有错误。

关于可能导致这种情况的任何想法?

更新:如果我从我的库文件夹中手动复制文件并将它们粘贴到node_modules我的主应用程序的文件夹中,它会起作用,这让我认为它涉及符号链接。

cie*_*awy 5

使用npm link'ed 库运行 karma需要preserveLinks: truetest(builder-angular:karma部分) 中添加angular.json

"test": {
      "builder": "@angular-devkit/build-angular:karma",
      "options": {
        "main": "src/test.ts",
        "preserveSymlinks": true,
        // ...
Run Code Online (Sandbox Code Playgroud)


小智 3

我遇到了同样的问题,我用该帖子上的解决方案解决了它:https ://github.com/jvandemo/generator-angular2-library/issues/277

问题发生当您将 npm install 命令本地应用到项目库文件夹时,npm 创建库的快捷方式并出现错误。

另一种解决方案是使用“npm pack yourlibary”命令打包库,并使用 npm install 在目标项目中安装生成的文件