При попытке 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.
angular
typescript
переполнение стека
источник
источник
Ответы:
В Angular 8 ViewChild принимает 2 параметра
источник
{ static: true }
.ng update
поможет вам сделать это автоматически, где это необходимо. Или, если вы уже обновили свои зависимости до Angular 8, эта команда поможет перенести ваш код:ng update @angular/core --from 7 --to 8 --migrate-only
true
, но если он может ждать до окончания инициализации, этоfalse
означает, что он не будет доступен до ngAfterViewInit / ngAfterContentInit.Угловой 8
В Angular 8 у ViewChild есть еще один параметр
Вы можете прочитать больше об этом здесь и здесь
Угловой 9
По
Angular 9
умолчанию значение равноstatic: false
, поэтому не нужно указывать параметр, если вы не хотите использовать{static: true}
источник
@ContentChild('foo', {static: false}) foo !: ElementRef;
. Мне любопытно насчет восклицательного знака. Это что-то новое с Angular 8 тоже?В Angular 8
ViewChild
принимает 2 параметра:Попробуйте вот так:
Объяснение:
Если вы установите статическое значение false , компонент ALWAYS будет инициализирован после инициализации представления во времени для
ngAfterViewInit/ngAfterContentInit
функций обратного вызова.Если вы установите static true , инициализация будет происходить при инициализации представления в
ngOnInit
По умолчанию вы можете использовать
{ static: false }
. Если вы создаете динамическое представление и хотите использовать переменную ссылки на шаблон, вам следует использовать{ static: true}
Для получения дополнительной информации, вы можете прочитать эту статью
В демоверсии мы перейдем к элементу div, используя переменную ссылки на шаблон.
С
{ static: true }
, мы можем использоватьthis.scrollTo.nativeElement
вngOnInit
, но с{ static: false }
,this.scrollTo
будетundefined
вngOnInit
, поэтому мы можем получить доступ только вngAfterViewInit
источник
это потому, что вид ребенка требует два аргумента, попробуйте так
источник
В Angular 8 ViewChild всегда принимает 2 параметра, а второй параметр всегда имеет static: true или static: false
Вы можете попробовать так:
Кроме того,
static: false
в Angular 9 будет использоваться стандартное аварийное поведение.Что такое статическое ложное / истинное: так что, как правило, вы можете пойти на следующее:
{ static: true }
должен быть установлен, когда вы хотите получить доступ к ViewChild в ngOnInit.{ static: false }
можно получить доступ только в ngAfterViewInit. Это также то, к чему вы хотите стремиться, когда у вас есть структурная директива (т.е. * ngIf) для вашего элемента в шаблоне.источник
Regex для замены всего через IDEA (протестировано с Webstorm)
Найти:
\@ViewChild\('(.*)'\)
Заменить:
\@ViewChild\('$1', \{static: true\}\)
источник
Вы должны использовать второй аргумент с ViewChild следующим образом:
источник
Использовать это
источник
В Angular 8 у ViewChild есть еще один параметр
Компонент @ViewChild ('nameInput', {static: false})
Я решил свою проблему, как показано ниже
@ViewChild (MatSort, {static: false}) sort: MatSort;
источник
Это также решило мою проблему.
источник