Angular 中使用module中component的一个坑

在一个module中使用另一个module的componet

最近在使用Angular做一个项目,之前对于angular的接触不多,所以使用过程中碰到了一些坑,在此记录其中一个

error

先上报错信息:

Error: src/app/product/product-list/product-list.component.html:2:1 - error NG8001: 'app-star' is not a known element:
1. If 'app-star' is an Angular component, then verify that it is part of this module.
2. If 'app-star' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.

下面详细解释错误的产生和解决方案

需求

一个很简单的需求,希望在product-list component (属于product module)中使用shared module中的star component. 工程目录app下的结构如下:

app
│  app-routing.module.ts
│  app.component.css
│  app.component.html
│  app.component.spec.ts
│  app.component.ts
│  app.module.ts
│
├─products
│      product-list.component.css
│      product-list.component.html
│      product-list.component.spec.ts
│      product-list.component.ts
│      products.module.ts
│
└─shared
        shared.module.ts
        star.component.css
        star.component.html
        star.component.spec.ts
        star.component.ts

创建过程

创建工程的步骤如下:

ng n mouduletest  //接下来的Add routing选Y,stylesheet 选CSS
ng g m products
ng g c products/product-list --flat
ng g m shared
ng g c shared/star --flat

在app-routing-module中增加路径定义并增加import:

import { ProductListComponent } from './product/product-list/product-list.component';
const routes: Routes = [
  {path:'',component:ProductListComponent}
];

这时候如果ng serve 是没有问题的,能够显示product-list works!

引入star component

在shared module 中export star component .
将shared.module中@NgModule声明中增加:

  exports:[
    StarComponent
  ]

然后在product-list module中import star module
在product.module的@NgModule声明中imports中增加SharedModule:

  imports: [
    CommonModule,
    SharedModule
  ],

再在product-list.componet.html中增加对star的引用。
增加:

<app-star></app-star>

这时候ng serve,报错了,错误内容就是开头的内容。

查找问题

经过了多方搜索,搜到结果最多的就是要在shared.module中增加exports,可是这个我已经做了。

转机

后来看了一个课程里面讲module,里面用到的结构跟我用到的差不多,但是是可以工作的,按照里面的命令和操作抄了一遍,居然能工作。

查找问题

下面的工作就变成了查看这两个工程的差异了,我按照无限接近的方式生成了一系列的工程,按照创建过程中的步骤把工程做的无限接近成功的工程。发现还是报错。
然后拿出beyond compare比较两个文件夹中的内容。最终发现了端倪。
成功的工程中app.module中@NgModule的imports中多了一行ProductModule.

然后我在之前error的工程中都照此加上,成功了。

总结一下

我感觉非常诡异的一点,app.module中没有import ProductModule,如果ProductModule中不引用其他module,那么能够正常使用,可是如果ProductModule中引用了SharedModule,那么就必须在appModule中引用 ProductModule,让我感到非常诡异,没有理解其中的逻辑,但是不管怎样,终于找到了问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在 Angular ,属性型指令是一种用于修改 HTML 元素属性的指令。它们可以通过添加特殊的属性到 HTML 元素上来使用。 下面是一个使用属性型指令的示例: 假设我们有一个名为 "highlight" 的属性型指令,它会将文本的背景颜色改为黄色。 在 HTML 模板,我们可以使用该指令: ``` <p highlight>这是一段需要高亮的文本。</p> ``` 在这里,我们将 "highlight" 属性添加到了段落标签上。Angular 会识别这个指令并执行它的逻辑,从而将文本的背景颜色更改为黄色。 ### 回答2: Angular的属性型指令是一种可以通过在HTML元素上添加属性来改变元素的行为或样式的指令。下面是一个使用属性型指令的简单示例。 假设有一个列表组件,需要在列表项上添加一个高亮效果。我们可以创建一个属性型指令来实现这个功能。 首先,在终端上通过Angular CLI生成一个新的属性型指令: ```shell ng generate directive highlight ``` 生成的指令文件 `highlight.directive.ts` 如下: ```typescript import { Directive, ElementRef, Input } from '@angular/core'; @Directive({ selector: '[appHighlight]' }) export class HighlightDirective { constructor(private el: ElementRef) {} @Input('appHighlight') highlightColor: string; ngOnInit() { this.el.nativeElement.style.backgroundColor = this.highlightColor || 'yellow'; } } ``` 然后,在组件的模板使用这个指令: ```html <ul> <li *ngFor="let item of items" [appHighlight]="'red'">{{ item }}</li> </ul> ``` 在上面的示例,我们在 `li` 元素上使用了 `appHighlight` 指令,并设置了高亮颜色为 `'red'`。这样,在渲染时,所有带有 `appHighlight` 属性的 `li` 元素都会被高亮显示为红色。 总结起来,使用属性型指令的步骤包括创建指令文件、在指令文件定义属性和逻辑,然后在模板应用指令并设置相关属性。通过这种方式,我们可以方便地在Angular修改元素的行为和样式。 ### 回答3: Angular的属性型指令是一种能够通过元素的属性来修改元素的行为或样式的指令。我们可以在HTML使用这些指令来动态改变元素的属性。 举个例子,假设我们有一个按钮元素,并且想要在按钮上添加一个背景颜色的指令。首先,我们需要在组件的模板将按钮元素添加上指令。比如: <button appBackgroundColorDirective>点击我</button> 然后,在组件我们需要创建一个指令,并且通过@Directive装饰器将其标记为属性型指令。在指令,我们可以通过@HostBinding装饰器来绑定具体的属性。比如,我们可以将背景颜色绑定到按钮的样式属性。 import { Directive, ElementRef, HostBinding } from '@angular/core'; @Directive({ selector: '[appBackgroundColorDirective]' }) export class BackgroundColorDirective { @HostBinding('style.backgroundColor') backgroundColor = 'red'; } 在上面的例子,我们创建了一个名为BackgroundColorDirective的指令,并使用@Directive装饰器将其标记为属性型指令。然后,通过@HostBinding装饰器将style.backgroundColor属性绑定到了backgroundColor变量。这意味着当我们在模板使用这个指令时,按钮的背景颜色将会被设置为红色。 最后,在应用的模块,我们需要将这个指令添加到NgModule的declarations数组,以便在应用可以使用它。比如: import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; import { BackgroundColorDirective } from './background-color.directive'; @NgModule({ imports: [BrowserModule], declarations: [AppComponent, BackgroundColorDirective], bootstrap: [AppComponent] }) export class AppModule { } 通过以上步骤,我们就可以在Angular使用属性型指令来修改元素的属性了。当我们运行应用时,按钮的背景颜色将会被设置为红色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值