【问题标题】:How do I configure my Angular library to depend on Angular Material?如何配置我的 Angular 库以依赖 Angular Material?
【发布时间】:2020-09-21 13:34:50
【问题描述】:

我已将 Angular Material 安装到我的库中,并创建了一个共享资源模块,用于导入和导出所有材质组件。现在我有一个包含模块和组件的文件夹。模块声明/导出包含组件,导入数组导入共享材质模块。

由于某种原因,该组件不会在故事书中创建故事,也不会通过任何单元测试,因为它找不到从共享资源导入的 MatRadioModule。

这是我得到的错误:

模板解析错误: 'mat-radio-button' 不是已知元素: 1. 如果“mat-radio-button”是一个 Angular 组件,则验证它是否是该模块的一部分。 2. 如果“mat-radio-button”是一个 Web 组件,则将“CUSTOM_ELEMENTS_SCHEMA”添加到该组件的“@NgModule.schemas”以禁止显示此消息。

这是材质模块:

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

// Angular Material Components
import {MatCheckboxModule} from '@angular/material/checkbox';
import {MatButtonModule} from '@angular/material/button';
import {MatInputModule} from '@angular/material/input';
import {MatAutocompleteModule} from '@angular/material/autocomplete';
import {MatDatepickerModule} from '@angular/material/datepicker';
import {MatFormFieldModule} from '@angular/material/form-field';
import {MatRadioModule} from '@angular/material/radio';
import {MatSelectModule} from '@angular/material/select';
import {MatSliderModule} from '@angular/material/slider';
import {MatSlideToggleModule} from '@angular/material/slide-toggle';
import {MatMenuModule} from '@angular/material/menu';
import {MatSidenavModule} from '@angular/material/sidenav';
import {MatToolbarModule} from '@angular/material/toolbar';
import {MatListModule} from '@angular/material/list';
import {MatGridListModule} from '@angular/material/grid-list';
import {MatCardModule} from '@angular/material/card';
import {MatStepperModule} from '@angular/material/stepper';
import {MatTabsModule} from '@angular/material/tabs';
import {MatExpansionModule} from '@angular/material/expansion';
import {MatButtonToggleModule} from '@angular/material/button-toggle';
import {MatChipsModule} from '@angular/material/chips';
import {MatIconModule} from '@angular/material/icon';
import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
import {MatProgressBarModule} from '@angular/material/progress-bar';
import {MatDialogModule} from '@angular/material/dialog';
import {MatTooltipModule} from '@angular/material/tooltip';
import {MatSnackBarModule} from '@angular/material/snack-bar';
import {MatTableModule} from '@angular/material/table';
import {MatSortModule} from '@angular/material/sort';
import {MatPaginatorModule} from '@angular/material/paginator';


@NgModule({
  imports: [
    MatCheckboxModule,
    MatCheckboxModule,
    MatButtonModule,
    MatInputModule,
    MatAutocompleteModule,
    MatDatepickerModule,
    MatFormFieldModule,
    MatRadioModule,
    MatSelectModule,
    MatSliderModule,
    MatSlideToggleModule,
    MatMenuModule,
    MatSidenavModule,
    MatToolbarModule,
    MatListModule,
    MatGridListModule,
    MatCardModule,
    MatStepperModule,
    MatTabsModule,
    MatExpansionModule,
    MatButtonToggleModule,
    MatChipsModule,
    MatIconModule,
    MatProgressSpinnerModule,
    MatProgressBarModule,
    MatDialogModule,
    MatTooltipModule,
    MatSnackBarModule,
    MatTableModule,
    MatSortModule,
    MatPaginatorModule
  ],
  exports: [
    MatCheckboxModule,
    MatCheckboxModule,
    MatButtonModule,
    MatInputModule,
    MatAutocompleteModule,
    MatDatepickerModule,
    MatFormFieldModule,
    MatRadioModule,
    MatSelectModule,
    MatSliderModule,
    MatSlideToggleModule,
    MatMenuModule,
    MatSidenavModule,
    MatToolbarModule,
    MatListModule,
    MatGridListModule,
    MatCardModule,
    MatStepperModule,
    MatTabsModule,
    MatExpansionModule,
    MatButtonToggleModule,
    MatChipsModule,
    MatIconModule,
    MatProgressSpinnerModule,
    MatProgressBarModule,
    MatDialogModule,
    MatTooltipModule,
    MatSnackBarModule,
    MatTableModule,
    MatSortModule,
    MatPaginatorModule
  ]
})
export class MaterialModule { }

这里是组件模块:

import { NgModule } from '@angular/core';
import { ButtonComponent } from './button.component';
import { FormsModule } from '@angular/forms';
import { ReactiveFormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { MaterialModule } from '../material.module';


@NgModule({
  declarations: [ButtonComponent],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    MaterialModule
  ],
  exports: [ButtonComponent]
})
export class ButtonModule { }

这是带有 html 的组件:

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

/**
 * @title Radios with ngModel
 */
@Component({
  selector: 'nds-button',
  templateUrl: 'button.component.html',
  styleUrls: ['button.component.css'],
})
export class ButtonComponent {

}
<mat-radio-group aria-label="Select an option">
  <mat-radio-button value="1">Option 1</mat-radio-button>
  <mat-radio-button value="2">Option 2</mat-radio-button>
</mat-radio-group>

现在我只是想知道为什么 mat-radio-button 不是已知元素?

我还应该补充一点,构建工作正常,但是在使用 Storybook 和运行我的 Jest 单元测试时会失败。

【问题讨论】:

  • 这能回答你的问题吗? Add Angular Material to a custom library
  • 不,不幸的是,这些东西都不适合我。我没有使用应用程序,只想要一个使用 Storybook 进行可视化的库。我尝试将 "@angular/material": "~9.2.1" 和 "@angular/cdk": "~9.2.1" 添加到 peerDependencies 和 Dependencies,但都不起作用。

标签: angular angular-material angular-library


【解决方案1】:

这个问题已经有了答案here

一般来说,您需要将@angular/material 添加为库的对等依赖项,然后从您的组件中调用该库。希望这会有所帮助。

【讨论】:

  • 我将 @angular/material 作为依赖项而不是 peerDependency。我没有与我的图书馆关联的应用程序,因为我正在使用 Storybook 进行可视化。我还有什么遗漏的吗?
【解决方案2】:

只需将材料模块导入故事书和规格文件。这就是它在测试或故事书中找不到组件的原因

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 2022-07-08
    • 1970-01-01
    • 2021-07-26
    • 2019-01-20
    • 2019-07-13
    • 2019-09-28
    • 2019-07-11
    相关资源
    最近更新 更多