我是Angular2的新手。我试图创建一个组件,但显示一个错误。
这是app.component.ts文件。
import { Component } from '@angular/core';
import { MyComponentComponent } from './my-component.component';
@Component({
selector: 'my-app',
template: `
<h1>Hello {{name}}</h1>
<h4>Something</h4>
<my-component></my-component>
`,
directives: [MyComponentComponent]
})
export class AppComponent { name = 'Sam' }
这是我要创建的组件。
import { Component } from '@angular/core';
@Component({
selector: 'my-component',
template: `
<p>This is my article</p>
`
})
export class MyComponentComponent {
}
显示两个错误:
如果my-component是一个Angular组件,那么验证它是否是这个模块的一部分。
如果my-component是Web组件,那么将CUSTOM_ELEMENTS_SCHEMA添加到@NgModule中。模式来抑制此消息。
请帮助。
你是否像这样在app.module.ts中导入它并删除指令位:-
@NgModule({
bootstrap: [AppComponent],
imports: [MyComponentModule],// or whatever the name of the module is that declares your component.
declarations: [AppComponent],
providers: []
})
export class AppModule {}
你的MyComponentModule应该是这样的
@NgModule({
imports: [],
exports: [MyComponentComponent],
declarations: [MyComponentComponent],
providers: [],
})
export class MyComponentModule {
}
你的MyComponentComponent应该在MyComponentModule中。
在MyComponentModule中,你应该把MyComponentComponent放在“exports”中。
类似的代码,请参见下面的代码。
@NgModule({
imports: [],
exports: [MyComponentComponent],
declarations: [MyComponentComponent],
providers: [],
})
export class MyComponentModule {
}
并像这样将MyComponentModule放在app.module.ts的导入中(参见下面的代码)。
import { MyComponentModule } from 'your/file/path';
@NgModule({
imports: [MyComponentModule]
declarations: [AppComponent],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
这样做之后,组件的选择器现在可以被应用程序识别。
你可以在这里了解更多信息:https://angular-2-training-book.rangle.io/handout/modules/feature-modules.html
希望你有app.module.ts。
在app.module.ts中添加以下行-
exports: [myComponentComponent],
是这样的:
import { NgModule, Renderer } from '@angular/core';
import { HeaderComponent } from './headerComponent/header.component';
import { HeaderMainComponent } from './component';
import { RouterModule } from '@angular/router';
@NgModule({
declarations: [
HeaderMainComponent,
HeaderComponent
],
imports: [
RouterModule,
],
providers: [],
bootstrap: [HeaderMainComponent],
exports: [HeaderComponent],
})
export class HeaderModule { }
检查filename. ponent.ts中的选择器
在各种html文件中使用标签
<my-first-component></my-first-component>
应该是
<app-my-first-component></app-my-first-component>
例子
@Component({
selector: 'app-my-first-component',
templateUrl: './my-first-component.component.html',
styleUrls: ['./my-first-component.component.scss']
})
在MyComponentModule中声明你的MyComponentComponent
将你的MyComponentComponent添加到MyComponentModule的exports属性中
mycomponentModule.ts
@NgModule({
imports: [],
exports: [MyComponentComponent],
declarations: [MyComponentComponent],
providers: [],
})
export class MyComponentModule {
}
将MyComponentModule添加到AppModule imports属性中
app.module.ts
@NgModule({
imports: [MyComponentModule]
declarations: [AppComponent],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
重要的是如果你仍然有这个错误,停止你的服务器从终端ctrl+c,并再次运行ng serve -o
在你的components.module.ts中,你应该像这样导入IonicModule
这样的:
import {IonicModule} from '@ionic/angular';
然后像这样导入IonicModule:
imports: [
CommonModule,
IonicModule
],
所以你的components.module.ts会像这样:
import { CommonModule } from '@angular/common';
import {PostComponent} from './post/post.component'
import { IonicModule } from '@ionic/angular';
@NgModule({
declarations: [PostComponent],
imports: [
CommonModule,
IonicModule
],
exports: [PostComponent]
})
export class ComponentsModule { }```
在我的例子中,我正在为一个使用子组件的组件编写单元测试,并且我正在编写测试以确保这些子组件在模板中:
it('should include the interview selection subview', () => {
expect(fixture.debugElement.query(By.css('app-interview')))
.toBeTruthy()
});
我没有得到一个错误,但一个警告:
警告:“应用面试”不是一个已知的元素:
如果'app-interview'是一个Angular组件,那么验证它是这个模块的一部分。警告:“应用面试”不是一个已知的元素:
如果'app-interview'是一个Angular组件,那么验证它是这个模块的一部分。
如果'app-interview'是一个Web组件,那么将'CUSTOM_ELEMENTS_SCHEMA'添加到'@NgModule '中。这个组件的模式
为了压制这条信息。”
此外,在测试期间,子组件没有在浏览器中显示。
我使用ng g c newcomponent来生成所有的组件,所以它们已经在appmodule中声明了,而不是我正在指定的组件的测试模块。
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ EditorComponent,
InterviewComponent]
})
.compileComponents();
}));
不要导出默认的MyComponentComponent类!
与标题相关的问题,如果不是具体的问题:
我不小心做了一个…
export default class MyComponentComponent {
... 这也把事情搞砸了。
为什么?当我把它放入声明时,VS Code添加了导入到我的模块,但不是…
import { MyComponentComponent } from '...';
它有
import MyComponentComponent from '...';
这并没有向上映射到下游,假设因为它没有在默认导入的任何地方“真正”命名。
export class MyComponentComponent {
没有违约。利润。
我使用的是Angular v11,在尝试延迟加载组件(await import('./my-component.component'))时遇到了这个错误,即使导入和导出设置正确。
我最终发现解决方案是删除单独的专用模块的文件,并将模块内容移动到组件文件本身中。
rm -r my-component.module.ts
并在my-component中添加模块。Ts(同一文件)
@Component({
selector: 'app-my-component',
templateUrl: './my-component.page.html',
styleUrls: ['./my-component.page.scss'],
})
export class MyComponent {
}
@NgModule({
imports: [CommonModule],
declarations: [MyComponent],
})
export class MyComponentModule {}
我有一个类似的问题,但没有一个提到的解决方案工作。最后我意识到我有一个路由问题:
我想如果我在应用程序路由中指定我的组件。模块如下:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { MainComponent } from './pages/main/main.component';
const routes: Routes = [
{
path: '',
component: MainComponent
},
]
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
我将不必在我的AppModule中导入MainModule,这是错误的,因为这里只有组件被导入。MainModule中声明的任何其他组件将不可见,这将导致您所描述的错误消息。
解决方案1:
导入声明模块
解决方案2:
惰性加载组件,如下所示:
const routes: Routes = [
{
path: '', loadChildren: () => import('path_to_your_declaringModule').then(m => m.declaringModule)},
}
这是可行的,因为整个模块都导入到这里。
我意识到你在你的例子中没有使用路由,只是把这个发布给其他可能使用路由并在搜索解决方案时偶然发现这个问题的人,就像我一样。