53

当我想使用以下包版本在 AOT 中编译我当前的项目时,我遇到了问题:

  • @ngtools/webpack@6.0.3
  • @angular@latest (6.0.2)
  • Webpack@4.0.0

我的 webpack 和 tsconfig.json 配置可以在这里找到

我遇到了一些与模板上使用的private/protected范围相关的问题,以及一些提取参数提供给一些真正不需要它的函数(例如未在 EventBinding 上使用的 $event)。

现在我有以下列表,我找不到我的问题在哪里:

/path/to/app/header/main-header/main-header.component.html(85,7): : 指令 TableOfContentComponent,预期 0 个参数,但得到 1。 (1,1): : 指令 TableOfContentComponent,预期 0争论,但得到 1。

我的main-header.component.html文件包含:// main-header.component.html

// main-header.component.ts
@ViewChildren('headerItems') public headerItems: QueryList<HeaderItemAbstract>;
mainMenuStates = {
    hamburger: false,
    bookmarks: false,
    search: false,
    toc: false,
    medias: false,
    article: false,
    language: false    
};

而且 myTableOfContentComponent不包含任何@Input属性。

@Component({
    selector: 'ps-table-of-content-template',
    templateUrl: './table-of-content.component.html',
    animations: [slideUpAndDownAnimation]
})
export class TableOfContentComponent extends HeaderItemAbstract implements OnInit {

    toc: TableOfContentModel[];

    devices: DevicesModel;

    tocContentHeight: number;
    tocContentMargin: number;
    menuHeight: string;


    constructor(private tableOfContentService: TableOfContentService,
                private deviceService: DeviceService,
                private elemRef: ElementRef) {
        super();
        this.toc = this.tableOfContentService.tableOfContent;
    }
}

/path/to/app/header/main-header/hamburger-menu/hamburger-menu.component.html(125,5): : 指令 SliderComponent,预期 0 个参数,但得到 1 个。 (1,1): : 指令SliderComponent,预期 0 个参数,但得到 1 个。

hamburger-menu.component.html的代码接近上述代码:

<ps-slider-component [template]="slidable" [countItems]="associatedDocuments.length">
    <ng-template #slidable>
        <ul class="clearfix">
            <li class="ps-hmt-associated-item-wrapper pull-left slider-item"
                *ngFor="let document of associatedDocuments">
                <a href="{{ document.link }}" target="_blank" class="btn-nostyle">
                    <div class="ps-hmt-image">
                        <img src="{{ document.images.thumbnail }}" alt="">
                    </div>
                    <p class="ps-hmt-title slider-text"
                        [matTooltip]="isArticleView ? null : document.title"
                        [matTooltipPosition]="'above'"
                        [matTooltipClass]="['ps-mat-tooltip', 'ps-mat-tooltip-doc']"
                    >
                        {{ document.title }}
                    </p>
                </a>
            </li>
        </ul>
    </ng-template>
</ps-slider-component>
// On ts side
associatedDocuments: Array<AssociatedDocumentModel>;
@ViewChild('slidable') slidable: ElementRef;

我的SliderComponent样子:

export class SliderComponent extends UnsubscribeHelper implements OnInit, OnChanges {

    @Input() template: ElementRef;
    @Input() countItems: number;
    @Input() resetSlide ?: null;
    @Input() fixedHeight?: null;
    @Input() isVariableWidth?: null;
    @Input() isBookmarks?: null;
    @Input() hasSkeleton?: boolean = false;

/path/to/app/header/main-header/medias/dialogs/image-dialog.component.html(34,5): : 指令 CarouselComponent,预期 0 个参数,但得到 1. (1,1): : 指令CarouselComponent,预期 0 个参数,但得到 1 个。

真的很接近前一个,我认为问题是一样的。

/path/to/app/document/page/page.component.html(7,9): : 指令 InfinityPageScrollComponent,预期 0 个参数,但得到 1。 (1,1): : 指令 InfinityPageScrollComponent,预期 0 个参数,但得到1.

在这里我们没有任何输入InfinityPageScrollComponent,标签是这样调用的<ps-infinity-page-scroll></ps-infinity-page-scroll>

我准确地说,当我在我的 webpack 上禁用 AOT 时,一切都像魅力一样工作。

我试图在AoT Do's 和 Don'ts上找到解决方案,但没有任何结果。

我还注意到,如果我禁用fullTemplateTypeCheck我将面临大约 18 000 个错误,其中包含一些隐含的任何类型以及更奇怪、未定义的属性,用于在构造函数上声明的服务。

--- 编辑 1:为抽象类提供代码:UnsubscribeHelper---

export abstract class HeaderItemAbstract extends UnsubscribeHelper implements AfterViewInit {
    public toggleItem: string = 'out';
    public ANIMATION_DURATION = slideUpAndDownAnimationDuration;

    constructor() {
        super();
    }

    // [Some other method]
    /**
     * Self animate after loading on DOM
     */
    ngAfterViewInit()
    {
        // Wait next to to avoid error :
        // ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked
        setTimeout(() => {
            this.toggleAnimation();
        },100);
    }
}

抽象类的代码UnsubscribeHelper

export abstract class UnsubscribeHelper implements OnDestroy {

    subscriptions: Subscription[] = [];

    ngOnDestroy() {
        this.subscriptions.forEach(sub => sub.unsubscribe());
    }

    addSubscription(subscription: Subscription) {
        this.subscriptions.push(subscription);
    }
}
4

4 回答 4

191

好吧,我在这里准备了一个最小,完整且可验证的示例

我注意到一个缺少的参数@HostListner

问题示例如下:

@HostListener('window:resize', ['$event'])
onResize(): void {
    
}

只需删除'$event'它就可以了。

总之,这两个选项可以正常工作:

// When you need the Event variable, you can use following syntax.
@HostListener('window:resize', ['$event'])
onResize($event: Event): void {
    
}

// When you do not need the Event variable, you can use following syntax.
@HostListener('window:resize')
onResize(): void {
    
}

感谢@tricheriche 的帮助。

于 2018-05-18T10:41:06.823 回答
38

我遇到了一些类似的错误 ERROR in (1,1): : Directive SomeComponent, Expected 0 arguments, but got 1. ,如此评论https://stackoverflow.com/a/50409526/9026103中所述,但现在发生了window:scroll

@HostListener('window:scroll', ['$event']) public onScroll(): void {
  ...
}

这不是很明显,因为在组件中定义的指令(@HostListener)就像消息中的匿名指令,并且不太清楚我必须在哪里搜索它。我用逻辑解决了这个消息:如果我们向名为 onScroll 的函数提供 $event - 我们需要在此处设置参数eventonScroll(event)因此 HostListener 指令的函数处理程序内没有参数,我们会收到此错误。但在我的情况下,它发生在第 1 行,如错误消息中所述,但 @HostListener 在所有函数下方声明,并且可能通过提升和优化,它出现在第 1 行。

解决的代码:

@HostListener('window:scroll', ['$event']) public onScroll(event /*provide $event to method here */): void {
  ...
}
于 2019-09-12T14:33:12.457 回答
1

我正在添加一个额外的答案,希望能帮助其他人搜索相同的错误消息但遇到不同的问题。

在我的情况下,我在基类中被覆盖的方法的签名有所不同。

export class Foo extends BaseFoo {

   // NOTE: Missing (parameter)
   onBlur() {
      this.touched();
   }
}

export class BaseFoo {
    onBlur(target: any) {
        ...
    }
 }

然后在同一个组件中,我缺少模板中的参数:

<div tabindex="0" (blur)="onBlur()>...</>
于 2019-04-06T18:17:31.717 回答
0

我在角度 8 中遇到了同样的错误

1>> 我将其升级到 9 并在项目中进行大量配置更改NOT RESOLVE

2>> 我在 stackOverflow 和 github 上进行了所有更改,但没有解决问题

对我来说是一个内部交叉的库@HostListener ,即 angular2-multiselect-dropdown(您可以在 npm 上轻松找到它)

这给出了 指令 ɵc 之类的错误,预期有 2 个参数,但得到了 1

(有时 AOT 会编译它,但大多数时候不会)但是每次我运行命令npm run build:ssr

最后花了一天多的时间后,我删除了这个库(angular2-multiselect-dropdown),一切正常

于 2020-02-25T13:25:44.020 回答