Помилка Angular @ViewChild (): Очікується 2 аргументи, але отримано 1


249

При спробі 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') ім'яInputRef: ElementRef;
переповнення стека

Відповіді:


497

У Angular 8 ViewChild приймає 2 параметри

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

9
чи можете ви позначити його як прийняте? Від кутових документів: статичний - чи вирішувати результати запиту до запуску виявлення змін (тобто повертати лише статичні результати). Якщо ця опція не передбачена, компілятор повернеться до своєї поведінки за замовчуванням, яка полягає у використанні результатів запитів для визначення часу вирішення запиту. Якщо будь-які результати запиту знаходяться всередині вкладеного перегляду (наприклад, * ngIf), запит буде вирішений після запуску виявлення змін. В іншому випадку це буде вирішено до запуску виявлення змін.
Дженсен

12
Ви повинні додати це до відповіді, якщо ви хочете, щоб він прийняв вашу відповідь як найкращу
Sytham

14
Примітка: щоб зберегти поведінку, яку ви мали у Angular 7, потрібно вказати { static: true }. ng updateдопоможе вам зробити це автоматично там, де потрібно. Або якщо ви вже оновили свої залежності до кутового 8, ця команда допоможе перенести ваш код:ng update @angular/core --from 7 --to 8 --migrate-only
evilkos

11
Якщо елемент повинен бути доступний під час ngOnInit, то статичним це має бути true, але якщо він може зачекати, поки після init це може бути false, це означає, що він буде недоступний до ngAfterViewInit / ngAfterContentInit.
Армен Закарян

Я цього не знав. Дякую. :-)
Tanzeel

84

Кутовий 8

У куті 8 у ViewChild є ще один параметр

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

Більше про це можна прочитати тут і тут

Кутовий 9

За Angular 9замовчуванням значення є static: false, тому не потрібно вказувати парам, якщо ви не хочете використовувати{static: true}


В одній із статей, з якою ви пов’язані, вони відображають синтаксис @ContentChild('foo', {static: false}) foo !: ElementRef;. Мені цікаво оклику. Це щось нове і з кутовим 8?
Конрад Вільтерстен

1
@KonradViltersten подивитися stackoverflow.com/a/56950936/2279488
Реза

26

У кутовій 8 ViewChildприймає 2 параметри:

Спробуйте так:

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

Пояснення:

{static: false}

Якщо встановити статичну помилку , компонент ЗАВЖДИ ініціалізується після ініціалізації перегляду вчасно для ngAfterViewInit/ngAfterContentInitфункцій зворотного виклику.

{static: true}

Якщо встановити статичну істину , ініціалізація відбудеться при ініціалізації перегляду вngOnInit

За замовчуванням ви можете використовувати { static: false }. Якщо ви створюєте динамічний вигляд і хочете використовувати довідкову змінну шаблону, тоді вам слід скористатися{ static: true}

Для отримання додаткової інформації ви можете прочитати цю статтю

Робоча демонстрація

У демонстраційному режимі ми прокручуємо до div, використовуючи змінну посилання шаблону.

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

З { static: true }, ми можемо використовувати this.scrollTo.nativeElementв ngOnInit, але з { static: false }, this.scrollToбуде undefinedв ngOnInit, тому ми можемо отримати доступ лише вngAfterViewInit


6

це тому, що дитина перегляду вимагає двох аргументів спробуйте так

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

@ViewChild ('iznosInput', {static: false,}) iznosInputRef: ElementRef;


3

У Angular 8 ViewChild завжди бере 2 парами, а другий парам завжди має статичну форму : true або static: false

Ви можете спробувати так:

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

Також, static: falseце буде стандартна поведінка за замовчуванням у Angular 9.

Що таке статичні помилкові / правдиві: Отже, як правило, ви можете перейти до наступного:

  • { static: true } потрібно встановити, коли ви хочете отримати доступ до ViewChild в ngOnInit.

    { static: false }можна отримати доступ лише в ngAfterViewInit. Це також те, що ви хочете зробити, коли у вас є елемент структури в шаблоні (тобто * ngIf).


1

Regex для заміни всіх через IDEA (тестовано за допомогою Webstorm)

Знайти: \@ViewChild\('(.*)'\)

Замінити: \@ViewChild\('$1', \{static: true\}\)


1

ви повинні використовувати другий аргумент з ViewChild таким чином:

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


0

У куті 8 у ViewChild є ще один параметр

Компонент @ViewChild ('nameInput', {static: false})

Я вирішив свою проблему, як нижче

@ViewChild (MatSort, {static: false}) сортування: MatSort;


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.