【问题标题】:Custom directive is not recognized in Angular 2Angular 2 中无法识别自定义指令
【发布时间】:2020-12-26 10:16:32
【问题描述】:

我创建了一个自定义指令并将其添加到我的 app.module 的声明中。但是当我在我的组件中使用它时,它给了我一个错误:

属性绑定 hasClaim 未被嵌入的任何指令使用 模板。确保属性名称拼写正确,并且 所有指令都列在“@NgModule.declarations”.ng

这就是我创建指令的方式:

import { Directive, TemplateRef, ViewContainerRef, Input } from '@angular/core';
import { SecurityService } from './security.service';

@Directive({
  // tslint:disable-next-line: directive-selector
  selector: '[hasClaim]'
})
export class HasClaimDirective {

  constructor(
    private templateRef: TemplateRef<any>,
    private viewContainer: ViewContainerRef,
    private ss: SecurityService,
  ) { }

  @Input() set hasClaim(claimType: any) {
    debugger;
    if (this.ss.hasClaim(claimType)) {
      this.viewContainer.createEmbeddedView(this.templateRef);
    } else {
      this.viewContainer.clear();
    }
  }
}

这就是我的实现方式:

 <ul class="nav">
      <ng-container *ngIf="securityObject.isAuthenticated">
        <li *ngFor="let menuItem of menuItems" routerLinkActive="active" class="{{menuItem.class}}">
            <a [routerLink]="[menuItem.path]" *hasClaim="'Admin'"> <=== THIS IS THE DIRECTIVE
                <i class="nc-icon {{menuItem.icon}}"></i>
                <p>{{menuItem.title}}</p>
            </a>
        </li>
      </ng-container>
      <ng-container *ngIf="!securityObject.isAuthenticated">
        <li routerLinkActive="active" class="">
          <a routerLink="/login">
          <i class="nc-icon nc-key-25"></i>
          <p>Login</p>
        </a>
        </li>
      </ng-container>
      <ng-container *ngIf="securityObject.isAuthenticated">
        <li routerLinkActive="active" class="" (click)="logout()">
          <a routerLink="/login">
          <i class="nc-icon nc-lock-circle-open"></i>
          <p>Logout</p>
        </a>
        </li>
      </ng-container>
    </ul>

【问题讨论】:

    标签: javascript angular typescript angular2-directives


    【解决方案1】:

    问题是您在app.module.ts 中声明指令,并且您想在navBarModule.module.ts 中声明的组件中使用

    如果您仅在 navbar.component 中使用指令,请在 NavBarModule.module 中声明该指令

    否则,您可以创建一个模块,例如utils.module在哪里声明和导出指令并在模块中导入需要该指令的组件

    import { NgModule } from '@angular/core';
    import {HasClaimDirective} from './hasclaim.directive'
    
    
    @NgModule({
      declarations: [ HasClaimDirective ],
      exports:[HasClaimDirective]
    })
    export class UtilsModule { }
    

    在导航模块中

    @NgModule({
      imports:      [ BrowserModule, FormsModule,UtilsModule ],
      declarations: [ NavBarComponent ],
      exports:[NavBarComponent ]
    })
    export class NavBarModule { }
    

    【讨论】:

      【解决方案2】:

      仔细观察错误信息:

      嵌入模板上的任何指令都没有使用属性绑定 hasClaim。确保属性名称拼写正确,并且所有指令都列在“@NgModule.declarations”.ng

      可能的修复 1:

      看看他们所说的这一行:

      directives are listed in the "@NgModule.declarations
      

      修复方法是:转到您的 app.module.ts,然后导入您的指令并在导入后将其添加到声明数组中

      例如:这是在我的项目中

      我这里有导入代表。

      我猜你的错误是试图告诉你 - 导入你的指令然后把它放在 app.module.ts 的声明数组中

      可能的修复 2:

      您不应在 html 中的指令前使用星号 (*)

      根据 Angular doc 的建议,阅读此文档页面可能会满足您的需求

      【讨论】:

        猜你喜欢
        • 2019-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-21
        • 2018-11-15
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        相关资源
        最近更新 更多