Açısal @ViewChild () hatası: 2 bağımsız değişken bekleniyordu, ancak 1 var


249

ViewChild'i denerken hatayı alıyorum. Hata "" opts "için bir argüman sağlanmadı."

Her iki @ViewChild hata veriyor.

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): hata TS2554: 2 bağımsız değişken bekleniyordu, ancak 1 var.


11. satırda neler var?
Tony Ngo

@TonyNgo @ViewChild ('nameInput') nameInputRef: ElementRef;
yığın taşması

Yanıtlar:


497

Açısal 8'de ViewChild 2 parametre alır

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

9
lütfen kabul edilmiş olarak işaretler misiniz? Açısal dokümanlar'dan: static - değişiklik algılama çalıştırmadan önce sorgu sonuçlarının çözülüp çözülmeyeceği (örneğin yalnızca statik sonuçları döndürün). Bu seçenek sağlanmazsa, derleyici varsayılan davranışına geri döner; bu, sorgu çözümlemesinin zamanlamasını belirlemek için sorgu sonuçlarını kullanmaktır. Herhangi bir sorgu sonucu iç içe bir görünümün içindeyse (örn. * NgIf), değişiklik algılama çalıştırıldıktan sonra sorgu çözülür. Aksi takdirde, değişiklik algılama çalışmadan önce çözülecektir.
Jensen

12
Cevabınızı en iyi yanıt olarak kabul etmesini istiyorsanız bunu cevaba
eklemelisiniz

14
Not: Açısal 7'de yaşadığınız davranışı korumak için belirtmeniz gerekir { static: true }. ng updategerektiğinde bunu otomatik olarak yapmanıza yardımcı olur. Veya, bağımlılıklarınızı Açısal 8'e yükselttiyseniz, bu komut kodunuzu ng update @angular/core --from 7 --to 8 --migrate-only
taşımanıza

11
Öğenin ngOnInit sırasında kullanılabilir olması gerekiyorsa true, statik olması gerekir , ancak başlangıçtan falsesonraya kadar bekleyebilirse, ngAfterViewInit / ngAfterContentInit olana kadar kullanılamayacağı anlamına gelir.
Armen Zakaryan

Bunu bilmiyordum. Teşekkürler. :-)
Tanzeel

84

Açısal 8

Açısal 8'de ViewChild'in başka bir parametresi var

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

Burada ve burada daha fazla bilgi edinebilirsiniz

Açısal 9

Gelen Angular 9varsayılan değer olduğunu static: false, bu nedenle kullanım istemedikçe param sağlamak gerekmez{static: true}


Bağlantı verdiğiniz makalelerden birinde sözdizimi gibi görünürler @ContentChild('foo', {static: false}) foo !: ElementRef;. Ünlem işaretini merak ediyorum. Bu, Açısal 8 ile yeni bir şey mi?
Konrad Viltersten

1
Bunu görmek @KonradViltersten stackoverflow.com/a/56950936/2279488
Reza

26

Açısal 8'de, ViewChild 2 parametre alır:

Şunu deneyin:

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

Açıklama:

{statik: yanlış}

Statik false değerini ayarlarsanız , ngAfterViewInit/ngAfterContentInitgeri arama işlevleri için görünümün zamanında başlatılmasından sonra DAİMA bileşeni başlatılır .

{statik: doğru}

Statik true değerini ayarlarsanız , başlatma işlemi,ngOnInit

Varsayılan olarak kullanabilirsiniz { static: false }. Dinamik bir görünüm oluşturuyorsanız ve şablon referans değişkenini kullanmak istiyorsanız,{ static: true}

Daha fazla bilgi için bu makaleyi okuyabilirsiniz

Çalışma Demosu

Demoda, şablon referans değişkenini kullanarak bir div öğesine gideceğiz.

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

İle { static: true }kullanabileceğimiz this.scrollTo.nativeElementiçinde ngOnInit, fakat { static: false }, this.scrollToolacak undefinedyılında ngOnInitbiz sadece in erişebilmesi için,ngAfterViewInit


6

çünkü görünüm çocuk iki argüman gerektirir böyle deneyin

@ViewChild ('nameInput', {statik: yanlış,}) nameInputRef: ElementRef;

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


3

Açısal 8'de, ViewChild her zaman 2 parametre alır ve ikinci parametrelerin her zaman statik değeri vardır: true veya static: false

Bu şekilde deneyebilirsiniz:

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

Ayrıca, static: falseAçısal 9'daki varsayılan geri dönüş davranışı olacaktır.

Statik yanlış / doğru nedir: Yani bir kural olarak aşağıdakiler için gidebilirsiniz:

  • { static: true } ngOnInit içinde ViewChild'e erişmek istediğinizde ayarlanması gerekir.

    { static: false }sadece ngAfterViewInit içinde erişilebilir. Şablonunuzdaki öğeniz üzerinde yapısal bir yönerge (yani * ngIf) olduğunda da bunu yapmak istersiniz.


1

Tümünü IDEA ile değiştirmek için normal ifade (Webstorm ile test edilmiştir)

bul: \@ViewChild\('(.*)'\)

Değiştir: \@ViewChild\('$1', \{static: true\}\)


1

ViewChild ile ikinci argümanı şu şekilde kullanmalısınız:

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


0

Açısal 8'de ViewChild'in başka bir parametresi var

@ViewChild ('nameInput', {static: false}) bileşeni

Sorunumu aşağıdaki gibi çözdüm

@ViewChild (MatSort, {statik: yanlış}) sırala: MatSort;


-5

Bu da benim sorunumu çözdü.

@ViewChild('map', {static: false}) googleMap;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.