ChatGPT解决这个技术问题 Extra ChatGPT

Angular @ViewChild() 错误:预期 2 个参数,但得到 1 个

尝试 ViewChild 时出现错误。错误是“未提供 'opts' 的参数。”

@ViewChild 都给出了错误。

import { Component, OnInit, ElementRef, ViewChild, Output, EventEmitter } from '@angular/core';
import { Ingredient } from 'src/app/shared/ingredient.model';

@Component({
  selector: 'app-shopping-edit',
  templateUrl: './shopping-edit.component.html',
  styleUrls: ['./shopping-edit.component.css']
})
export class ShoppingEditComponent implements OnInit {

@ViewChild('nameInput') nameInputRef: ElementRef;
@ViewChild('amountInput') amountInputRef: ElementRef;
@Output() ingredientAdded = new EventEmitter<Ingredient>();
  constructor() {}

  ngOnInit() {
  }

  onAddItem() {
    const ingName = this.nameInputRef.nativeElement.value;
    const ingAmount = this.amountInputRef.nativeElement.value;
    const newIngredient = new Ingredient(ingName, ingAmount);
    this.ingredientAdded.emit(newIngredient);
  }

}

ts(11,2):错误 TS2554:预期 2 个参数,但得到 1 个。

第 11 行是什么?
@TonyNgo @ViewChild('nameInput') nameInputRef: ElementRef;

J
Jensen

在 Angular 8 中, ViewChild 采用 2 个参数

 @ViewChild(ChildDirective, {static: false}) Component

你能把它标记为接受吗?来自 Angular 文档:静态 - 是否在更改检测运行之前解析查询结果(即仅返回静态结果)。如果未提供此选项,编译器将退回到其默认行为,即使用查询结果来确定查询解析的时间。如果任何查询结果在嵌套视图中(例如 *ngIf),则查询将在更改检测运行后解析。否则,它将在更改检测运行之前解决。
如果您希望他接受您的答案为最佳答案,则应将其添加到答案中
注意:要保持您在 Angular 7 中的行为,您需要指定 { static: true }ng update 将帮助您在需要时自动执行此操作。或者,如果您已经将依赖项升级到 Angular 8,此命令将帮助您迁移代码:ng update @angular/core --from 7 --to 8 --migrate-only
如果元素需要在 ngOnInit 期间可用,则 static 需要为 true,但如果它可以等到 init 之后它可以是 false,这意味着它直到 ngAfterViewInit/ngAfterContentInit 才可用。
我不知道。谢谢。 :-)
R
Reza

角 8

在 Angular 8 中,ViewChild 有另一个参数

@ViewChild('nameInput', {static: false}) component : Component

您可以阅读有关它的更多信息 herehere

角 9 和角 10

Angular 9 中默认值为 static: false,因此不需要提供参数,除非您想使用 {static: true}


在您链接到的一篇文章中,它们显示的语法类似于 @ContentChild('foo', {static: false}) foo !: ElementRef;。我对感叹号很好奇。这也是 Angular 8 的新功能吗?
@KonradViltersten 看到这个stackoverflow.com/a/56950936/2279488
F
Fouad Boukredine

在 Angular 8 中,ViewChild 采用 2 个参数:

试试这样:

@ViewChild('nameInput', { static: false }) nameInputRef: ElementRef;

解释:

{静态:假}

如果您设置 static false,则子组件总是在视图初始化后及时为 ngAfterViewInit/ngAfterContentInit 回调函数初始化。

{静态:真}

如果您设置 static true,则子组件初始化将在 ngOnInit 处的视图初始化时进行

默认情况下,您可以使用 { static: false }。如果您正在创建动态视图并希望使用模板引用变量,那么您应该使用 { static: true}

有关详细信息,您可以阅读此article

工作演示

在演示中,我们将使用模板引用变量滚动到一个 div。

 @ViewChild("scrollDiv", { static: true }) scrollTo: ElementRef;

使用 { static: true },我们可以在 ngOnInit 中使用 this.scrollTo.nativeElement,但是使用 { static: false }this.scrollTongOnInit 中将是 undefined,因此我们只能在 ngAfterViewInit 中访问


p
paras shah

这是因为视图子需要两个参数尝试这样

@ViewChild('nameInput', { static: false, }) nameInputRef: ElementRef; @ViewChild('amountInput', { static: false, }) amountInputRef: ElementRef;


P
Pinki Dhakad

在 Angular 8 中,ViewChild 始终采用 2 个参数,而第二个参数始终具有 static: true 或 static: false

你可以这样尝试:

@ViewChild('nameInput', {static: false}) component

此外,static: false 将成为 Angular 9 中的默认后备行为。

什么是静态假/真:根据经验,您可以选择以下内容:

{ static: true } 需要在 ngOnInit 中访问 ViewChild 时设置。 { static: false } 只能在 ngAfterViewInit 中访问。当您在模板中的元素上有一个结构指令(即 *ngIf)时,这也是您想要的。


p
prosoitos

在 Angular 8.0 中试试这个:

@ViewChild('result',{static: false}) resultElement: ElementRef;

这个问题已经有一年了,但你有理由,在 Angular 8.0 中是必要的 {static:true/false}。在 Angular 9 和 10 中,这个参数是可选的
T
Torsten Simon

通过 IDEA 替换所有的正则表达式(用 Webstorm 测试)

查找:\@ViewChild\('(.*)'\)

替换:\@ViewChild\('$1', \{static: true\}\)


H
Hammad Ahmad

你应该像这样使用 ViewChild 的第二个参数:

@ViewChild("eleDiv", { static: false }) someElement: ElementRef;

D
Dhilrukshan Pradeep

用这个

@ViewChild(ChildDirective, {static: false}) 组件


M
Manoj Tyagi

在 Angular 8 中,ViewChild 有另一个参数

@ViewChild('nameInput', {static: false}) 组件

我解决了我的问题,如下所示

@ViewChild(MatSort, {static: false}) 排序:MatSort;


A
Arsman Ahmad

这也解决了我的问题。

@ViewChild('map', {static: false}) googleMap;

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅