如何将组件导入Angular 2中的另一个根组件

Posted

技术标签:

【中文标题】如何将组件导入Angular 2中的另一个根组件【英文标题】:How to import component into another root component in Angular 2 【发布时间】:2017-01-17 12:52:15 【问题描述】:

我正在尝试将组件从一个文件导入另一个根组件文件。 它给出的错误为..

zone.js:484 未处理的承诺拒绝:模板解析错误: “课程”不是已知元素: 1. 如果“课程”是一个 Angular 组件,则验证它是该模块的一部分。 2. 如果“课程”是一个 Web 组件,则将“CUSTOM_ELEMENTS_SCHEMA”添加到该组件的“@NgModule.schema”以禁止显示此消息。 ("

我的第一个 Angular 2 应用程序

[ERROR ->]"):AppComponent@0:31;区域:;任务:Promise.then;值:错误:模板解析错误:(...) 错误:模板解析错误: “课程”不是已知元素:

我的 app.component.ts 就像 [根组件文件]

import  Component  from '@angular/core';
import CoursesComponent from './courses.component';

@Component(
  selector: 'my-app',
  template: '<h1>My First Angular 2 App</h1><courses></courses>',
  directives:[CoursesComponent],
)

export class AppComponent  

我的课程.component.ts 是;

import  Component  from '@angular/core';
@Component(
  selector: 'courses',
  template: '<h1>courses</h1>'
)
export class CoursesComponent  

从 app.component 中的 courses.component.ts 文件导入课程组件时,我无法在 @Component 中声明指令

directives:[CoursesComponent] 给我错误

请提供解决方案。

【问题讨论】:

您使用的是哪个 Angular2 版本? 【参考方案1】:

您应该使用 declarations array(meta property) of @NgModule 声明它,如下所示(RC5 and later),

import CoursesComponent from './courses.component';

@NgModule(
  imports:      [ BrowserModule],
  declarations: [ AppComponent,CoursesComponent],  //<----here
  providers:    [],      
  bootstrap:    [ AppComponent ]
)

【讨论】:

【参考方案2】:

对于 Angular RC5 和 RC6,您必须在模块元数据装饰器的 declarations 键中声明组件,因此在您的主模块 declarations 中添加 CoursesComponent 作为 ,并从 AppComponent 元数据中删除 directives .

import  NgModule  from '@angular/core';
import  BrowserModule  from '@angular/platform-browser';

import  AppComponent  from './app.component';
import  CoursesComponent  from './courses.component';

@NgModule(
  imports:      [ BrowserModule ],
  declarations: [ AppComponent, CoursesComponent ],
  bootstrap:    [ AppComponent ]
)
export class AppModule  

【讨论】:

【参考方案3】:

Angular RC5 和 RC6

如果您在 Jasmine 测试中遇到上述错误,很可能是因为您必须在 TestBed.configureTestingModule() 中声明不可渲染组件。

TestBed 为单元测试配置和初始化环境,并提供在单元测试中模拟/创建/注入组件和服务的方法。

如果您在执行单元测试之前不声明组件,Angular 将不知道您的模板文件中的 &lt;courses&gt;&lt;/courses&gt; 是什么。

这是一个例子:

import async, ComponentFixture, TestBed from "@angular/core/testing";
import AppComponent from "../app.component";
import CoursesComponent from './courses.component';

describe('CoursesComponent', () => 
  let component: CoursesComponent;
  let fixture: ComponentFixture<CoursesComponent>;

  beforeEach(async(() => 
    TestBed.configureTestingModule(
      declarations: [
        AppComponent,
        CoursesComponent
      ],
      imports: [
        BrowserModule
        // If you have any other imports add them here
      ]
    )
    .compileComponents();
  ));

  beforeEach(() => 
    fixture = TestBed.createComponent(CoursesComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  );

  it('should create', () => 
    expect(component).toBeTruthy();
  );
);

【讨论】:

这是我正在寻找的答案。谢谢! 救了我的命。谢谢。我被 React/Jest/Enzyme 宠坏了,它可以自动消除这种乏味。【参考方案4】:

以上答案简单来说, 你必须在@NgModule's 下注册

declarations: [
    AppComponent, YourNewComponentHere
  ] 

app.module.ts

不要忘记import 该组件。

【讨论】:

以上是关于如何将组件导入Angular 2中的另一个根组件的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据共享到 Angular 中的另一个组件?

将组件作为“参数”传递给Angular 2中的另一个组件

将对象从一个组件传递到Angular中的另一个组件

如何从Angular中的另一个组件调用组件的ngOnit函数

将数据从一个函数传递到同一个 Angular 组件中的另一个函数

如何从 Angular 6 中的另一个组件的打字稿中激活和停用组件中的样式?