Angular 4指令错误:无法解析指令

时间:2017-07-19 14:49:55

标签: angular typescript angular-directive

我是Angular的新手并试图从Angular指南中注入basic structural directive。这是我的指示:

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

@Directive({
  selector: '[pcDropdown]'
})
export class DropdownDirective {
  private hasView = false;

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

  @Input() set pcDropdown(condition: boolean) {
    if (!condition && !this.hasView) {
      this.viewContainer.createEmbeddedView(this.templateRef);
      this.hasView = true;
    } else if (condition && this.hasView) {
      this.viewContainer.clear();
      this.hasView = false;
    }
  }
}

我正在尝试将其注入我的TradeModule

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '../shared/shared.module';
import { TradeComponent } from './trade.component';
import { DropdownDirective } from '../dropdown.directive/dropdown.directive';

@NgModule({
  imports: [
    CommonModule,
    SharedModule
  ],
  declarations: [TradeComponent, DropdownDirective],
  exports: [DropdownDirective]
})
export class TradeModule { }

在我的TradeComponent模板中使用以下部分HTML:

...
<p *pcDropdown="true">
  TEST
</p>
...

但是我收到了错误:

  

未捕获错误:无法解析DropdownDirective的所有参数:   ([object Object],[object Object],?)。

Webstorm也是我的@Directive装饰者的基础,并说出以下内容:

  

Angular:无法解析DropdownDirective的所有参数   /home/commercialsuicide/Desktop/my-app/src/client/app/dropdown.directive/dropdown.directive.ts:   ([object Object],[object Object],?)

enter image description here

它还说我的pcDropdown输入未使用:

enter image description here

需要说明的是,我已经在emitDecoratorMetadata中看到this answertrue已设置为tsconfig.json

请指出我拼写错误或忘记在我的代码中包含某些内容的地方。

非常感谢

3 个答案:

答案 0 :(得分:5)

private items缺少类型参数。如果Angular无法将所有参数解析为提供者,则Angular无法创建组件实例 解析为提供程序仅适用于参数类型和@Inject(...)注释。

如果您不想注射items,请删除该参数。在任何情况下,您都不需要自己创建组件实例来明确传递参数。

答案 1 :(得分:0)

我刚刚离开我的案子,因为我的要求找到了这个问题。

我有注释@HostListener和onResize方法。 @HostListener应该在相关方法之前和之前。喜欢

@HostListener("window:resize", ["$event"])
getSomeObjects (args:any = {}) {
    // some code
}

onResize(event) {
    // some code
}

在调用另一个方法之前移动了注释时出现此错误。像

POST http://localhost:444/xml HTTP/1.1
User-Agent: User-Agent: STORMWARE HTTP client. http://www.stormware.cz
STW-Authorization: Basic QDo=
Content-Type: text/xml
Accept-Encoding: gzip, deflate
Host: http://localhost:444
Content-Length: 527
Pragma: no-cache
Connection: Keep-Alive

<?xml version="1.0" encoding="Windows-1250"?>
<dat:dataPack xmlns:dat="http://www.stormware.cz/schema/version_2/data.xsd" xmlns:stk="http://www.stormware.cz/schema/version_2/stock.xsd" xmlns:ftr="http://www.stormware.cz/schema/version_2/filter.xsd" xmlns:lStk="http://www.stormware.cz/schema/version_2/list_stock.xsd" xmlns:typ="http://www.stormware.cz/schema/version_2/type.xsd" id="00000001" ico="25313142" application="HTTP klient" version="2.0" note="Export zasob">
  <dat:dataPackItem id="00000001" version="2.0">
    <lStk:listStockRequest version="2.0" stockVersion="2.0">
      <lStk:requestStock/> 
    </lStk:listStockRequest> 
  </dat:dataPackItem> 
</dat:dataPack> 

希望,这会对某人有所帮助!

答案 2 :(得分:0)

我遇到此错误,就我而言,是因为我有一个名为Storage的服务,但是编译器不会将其标记为错误,因为javascript具有一个名为相同的全局变量。所以我刚刚添加:

import { Storage } from '@core/auth/token-storage.service';