Ao tentar o ViewChild, estou recebendo o erro. O erro é "Não foi fornecido um argumento para 'opts'".
O @ViewChild está dando o erro.
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): erro TS2554: Esperava 2 argumentos, mas obteve 1.
angular
typescript
estouro de pilha
fonte
fonte
Respostas:
No Angular 8, o ViewChild usa 2 parâmetros
fonte
{ static: true }
.ng update
ajudará você a fazer isso automaticamente sempre que necessário. Ou, se você já tiver atualizado suas dependências para Angular 8, este comando irá ajudar a migrar seu código:ng update @angular/core --from 7 --to 8 --migrate-only
true
, mas se puder esperar até depois do initfalse
, o que significa que não estará disponível até ngAfterViewInit / ngAfterContentInit.Angular 8
No Angular 8, o ViewChild possui outro parâmetro
Você pode ler mais sobre isso aqui e aqui
Angular 9
No
Angular 9
valor padrãostatic: false
, é , portanto, não é necessário fornecer parâmetros, a menos que você queira usar{static: true}
fonte
@ContentChild('foo', {static: false}) foo !: ElementRef;
. Estou curioso sobre o ponto de exclamação. Isso também é algo novo no Angular 8?No Angular 8, são
ViewChild
necessários 2 parâmetros:Tente assim:
Explicação:
Se você definir estático false , o componente SEMPRE será inicializado após a inicialização da exibição no tempo das
ngAfterViewInit/ngAfterContentInit
funções de retorno de chamada.Se você definir static true , a inicialização ocorrerá na visualização de inicialização em
ngOnInit
Por padrão, você pode usar
{ static: false }
. Se você estiver criando uma visualização dinâmica e desejar usar a variável de referência do modelo, deverá usar{ static: true}
Para mais informações, você pode ler este artigo
Na demonstração, rolaremos para uma div usando a variável de referência do modelo.
Com
{ static: true }
, podemos usarthis.scrollTo.nativeElement
inngOnInit
, mas with{ static: false }
,this.scrollTo
estaráundefined
inngOnInit
, para que possamos acessar somente emngAfterViewInit
fonte
é porque view child requer dois argumentos e tente assim
fonte
No Angular 8, o ViewChild sempre usa 2 parâmetros e o segundo parâmetro sempre tem static: true ou static: false
Você pode tentar assim:
Além disso, esse
static: false
será o comportamento de fallback padrão no Angular 9.O que é estático false / true: Portanto, como regra geral, você pode fazer o seguinte:
{ static: true }
precisa ser definido quando você deseja acessar o ViewChild no ngOnInit.{ static: false }
só pode ser acessado em ngAfterViewInit. Também é isso que você deseja quando tiver uma diretiva estrutural (por exemplo, * ngIf) no seu elemento no seu modelo.fonte
Regex para substituir tudo via IDEA (testado com Webstorm)
Encontrar:
\@ViewChild\('(.*)'\)
Substituir:
\@ViewChild\('$1', \{static: true\}\)
fonte
você deve usar o segundo argumento com o ViewChild assim:
fonte
Usa isto
fonte
No Angular 8, o ViewChild possui outro parâmetro
Componente @ViewChild ('nameInput', {static: false})
Resolvi meu problema como abaixo
@ViewChild (MatSort, {estático: false}) sort: MatSort;
fonte
Isso também resolveu meu problema.
fonte