【问题标题】:Angular2 - 'ng build -prod' results in Supplied parameters do not match any signature of call targetAngular2 - 'ng build -prod'导致提供的参数与调用目标的任何签名都不匹配
【发布时间】:2018-01-18 18:19:37
【问题描述】:

我正在使用什么

  • 角度

我要做什么

  • 运行 ng build -prod 命令

会发生什么

  • 我收到以下错误:

提供的参数与调用目标的任何签名都不匹配。

  • 运行 'ng build --watch' 时不存在此错误

我的尝试

  • 我删除了一些 HTML,其中包括一个提交按钮,用于将一些值传递给我的组件打字稿文件中的函数。当我这样做时,构建命令工作正常。

组件 HTML

下面是导致问题的 HTML sn-p。我正在从输入字段中获取值并将它们推送到函数中。运行“ng build -watch”时,我没有任何问题,一切正常。只有在“prod”命令上,我才会在终端中收到错误

      <div class="vs__details__actions">
        <button class="vs__button" 
        [disabled]="!selectedFiles" 
        (click)="submitForm(newTitle.value, newReference.value, newDate.value, newAuditorName.value, newCompanyName.value); newTitle.value=''; 
        newReference.value=''; newDate.value=''; newAuditorName.value=''; newCompanyName.value=''"> 
        Add 
      </button>
      </div>

组件 Typescript 文件

import { Component, OnInit } from '@angular/core';
import { ProjectsAddService } from './projects-add.service';
import { Upload } from './upload';
import * as _ from "lodash";

@Component({
  selector: 'upload-form',
  templateUrl: './projects-add.component.html',
  styleUrls: ['./projects-add.component.css']
})
export class ProjectsAddComponent {

  selectedFiles: FileList;
  currentUpload: Upload;

  constructor(private upSvc: ProjectsAddService) { }

  detectFiles(event) {
    this.selectedFiles = event.target.files;
  }

  uploadSingle() {
    let file = this.selectedFiles.item(0)
    this.currentUpload = new Upload(file);
  }

  submitForm(title: string, reference: string, date: string, auditorName: string, newCompanyName: string, upload: Upload) {
    let file = this.selectedFiles.item(0)
    this.currentUpload = new Upload(file);
    this.upSvc.submitForm(title, reference, date, auditorName, newCompanyName, this.currentUpload);
  }


}

任何帮助将不胜感激:)

【问题讨论】:

  • 什么是(点击)功能?你检查过压痕吗?这是一个错字还是真的是这样?
  • 点击是我将新输入值传递给component.ts中的函数的方式。至于缩进,那是stackoverflow。我不能把它整齐地挤进去......

标签: angular typescript angular2-aot


【解决方案1】:

使用--prod(生产模式),angular-cli 将使用 AoT(提前编译)。

AoT 对类型、签名和其他东西更加敏感。

您的 submitForm 函数需要一个(非可选的)upload: Upload 参数作为最后一个参数,您不会在点击时传递该参数。

这里有两个选项:

第一种(也是建议的)方式:使其成为可选的,例如 submitForm(title: string, reference: string, date: string, auditorName: string, newCompanyName: string, upload?: Upload)

替代方案:在模板的最后一个参数处传递 null

希望对你有帮助。


更新:在您编辑您的问题和评论后,我可能应该在此处添加第三个选项:只需删除参数,如果它未在您的函数中使用。

【讨论】:

  • 啊,明白了。上传实际上来自打字稿文件,这就是为什么它没有在 HTML 中引用,因为它不是我需要从 HTML 传递的东西。我更新了我的代码以显示完整的打字稿文件。在这种情况下,最好的选择是什么?
  • 如果你不需要传递它(像以往一样)你为什么将它声明为参数?删除它。
  • 抱歉,我可能不太清楚。我正在调用一个上传服务,它需要来自 html 和上传的所有新输入值。但是上传来自组件 ts 文件,而不是 html。我上面的评论是说我不/不能通过 HTML 上传,这就是为什么它只是 TS 文件。正如你所说,这意味着提交按钮为 5 个参数,但 ts 功能为 6。但它需要 6。这就是我现在卡住的地方。
  • 为什么?您没有使用参数,因此您不需要它。在您的组件 submitForm 函数中,您调用另一个具有相同名称的函数,但这是在您的服务中,而不是在您的组件中。而且您不会从函数中传递 upload 对象,而是传递组件的 currentUpload 的引用。所以不,你不需要 6 个,你只需要前 5 个。
  • 天哪……你是对的。我怎么对它如此盲目?!我已经盯着它很久了。 Lexith 好先生,感谢您的耐心等待!
【解决方案2】:

您的提交表单需要 6 个参数,并且您在模板中使用 5 个值调用该函数。 您缺少“上传”的值。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2017-09-02
    • 1970-01-01
    • 2017-08-24
    • 2017-05-08
    • 2017-11-14
    • 2016-12-07
    • 2018-01-08
    • 2016-11-27
    相关资源
    最近更新 更多