Vscode-ng-language-service: Suporta encadeamento opcional no modelo

Criado em 18 ago. 2017  ·  70Comentários  ·  Fonte: angular/vscode-ng-language-service

em 0.1.4 no Windows 10

errors?.required é destacado como um erro

Nome é obrigatório

image

bug

Comentários muito úteis

isso funcionou para mim:

Espero que ajude você.

Todos 70 comentários

Também acontecendo no OS X 10.11.6 (El Capitan).

OS: OS X 10.11.6
Versão da extensão: 0.1.4
Versão do código VS: 1.15.1

Eu também tenho esse problema no Windows 10 x64
Versão da extensão 0.1.7
VS Code versão 1.15.1
Por favor, corrija isso logo

Mesmo problema aqui.
O erro é: 'Identificador' erros 'não está definido. 'NgModel' não contém tal membro '.

SO: macOS 10.13
Extensão: 0.1.7
Código VS: 1.16.1
Angular: 4.4.3
Texto datilografado: 2.5.2

Mesmo problema! Qualquer solução?

Devo importá-lo no app.module ou no meu componente onde o formulário existe?

As importações de @ angular / forms mencionadas por @VladBozhinovski não vão resolver.
Tipo de relacionado: https://github.com/angular/vscode-ng-language-service/issues/179

Sim, também não funcionou ...

eu tenho o mesmo problema .... alguma solução?

Mesmo problema, alguém encontrou uma solução?

Mesmo problema aqui. Alguma ideia ainda?

Eu também tenho esse problema de qualquer solução

Mesmo aqui.

parece que não estou sozinho :)

Muitas pessoas têm esse problema. Vocês podem evitar como 'email? .Error.required'

@ Duanthse03268 isso funcionou removendo o erro da linha vermelha, mas ainda obtém o seguinte erro de console, alguma ideia do porquê?

FoodFormComponent.html:9 ERROR TypeError: Cannot read property 'minlength' of undefined at Object.eval [as updateDirectives] (FoodFormComponent.html:10) at Object.debugUpdateDirectives [as updateDirectives] (core.es5.js:13056) at checkAndUpdateView (core.es5.js:12236) at callViewAction (core.es5.js:12601) at execComponentViewsAction (core.es5.js:12533) at checkAndUpdateView (core.es5.js:12242) at callViewAction (core.es5.js:12601) at execComponentViewsAction (core.es5.js:12533) at checkAndUpdateView (core.es5.js:12242) at callWithDebugContext (core.es5.js:13456)

Certifique-se de importar
import {FormsModule, Validators} de '@ angular / forms';

Nenhuma das soluções neste tópico resolve o problema. Fiz um exemplo o mais simples possível para ter certeza de que nada mais estava atrapalhando:

screen shot 2018-01-08 at 22 56 53

FormModule e Validadores foram importados de @ angular / forms. Eu também testei esta solução por @ Duanthse03268 , e não apenas não resolve o problema da linha vermelha, mas também causa um erro no console quando o estado de myField muda (TypeError: Não é possível ler a propriedade 'necessária' de null) se usado sem o '?' após 'erros'.

Minha implementação funciona sem erros no navegador, mas mantém a linha vermelha (supostamente incorreta) no editor (VSCode). Síntese dos arquivos em questão (tudo o mais você pode simplesmente 'ng new ...' para reproduzir):

app.module.ts
app.component.ts
app.component.html

Versões:

Extensão: 0.1.7
VSCode: 1.19.1
CLI Angular: 1.6.3
Nó: 9.2.1
OS: macOS 10.12.6
Angular: 5.1.3
Chrome: 63.0.3239.84

Por que você não tentou usar 'myfield? .Error.required'.

Eu tentei, assim como escrevi em meu comentário anterior: "não só não resolve o problema da linha vermelha, mas também causa um erro no console quando o estado de myField muda (TypeError: Não é possível ler a propriedade 'necessária' de null ) ".

Portanto, para elaborar, 'myField? .Errors.required' não funciona e faz com que a mensagem de erro acima seja exibida no console. O '?' tem que ser escrito após 'erros' para que este código funcione no navegador sem mensagem de erro, mas não resolve o problema original da linha vermelha incorreta no editor.

Isso é extremamente irritante, pois as linhas vermelhas ainda estão lá, mas a funcionalidade funciona. Concordo com joonashak porque as soluções apresentadas não funcionam e tentar os dois formatos não resolve o problema.

isso funcionou para mim:

Espero que ajude você.

Apenas soluções alternativas :(

IntelliJ lança o mesmo erro para mim. Mas a implementação funciona mesmo com os erros do navegador. A solução alternativa por @Ahnset funcionou para mim. Gostaria de saber o que é essa sintaxe e como está funcionando agora?

Descobri que esse erro aparece sempre que você faz referência a uma propriedade definida como 'qualquer'. Outra solução alternativa é usar a anotação de propriedade de colchetes, clientFirstName? .Errors ['required'] que também é muito estúpida.

Está piorando, com a última atualização do vscode, minha árvore de arquivos se tornou mais como uma árvore de natal: christmas_tree:

@adickenscheidt obrigado pela solução alternativa. Funciona muito bem, concordo idiota por enquanto.

removeu o Angular Language Service ...

@ Duanthse03268 Sua função funciona! Obrigado.

@adickenscheidt
Obrigado, esta solução funciona para mim

Funcionou. Muito apreciado @ Duanthse03268

@ Duanthse03268 Sua função funciona! Mas o que isso significa exatamente?

Não funciona para propriedade de objeto aninhado
<mat-select [(ngModel)]="object?.nestedObject?.property" name="property" #property="ngModel">
recebendo erros de análise supercool em object?.object?.property

Eu uso isso. Feio, mas funciona.
name?.errors && name?.errors['required']

email.errors ['obrigatório'] funcionou para mim

@guignol1981 A solução funcionou para mim.

Usar isso funcionou para mim:

Apenas o nome do elemento precisa do? marca. Não é tão feio

Tenho o mesmo problema, mas nenhuma das soluções propostas funcionou:
"form? .get ('name'). errors.required"
"formulário? .get ('nome'). erros. ['obrigatório']"
"formulário? .get ('nome'). erros?. necessário"

Olá, tente assim.
Form.hasError ('obrigatório');

Isso funcionou para mim. Obrigado @antonheck

existem algumas soluções alternativas, cada uma melhor para uma situação diferente, sim. Mas essa não é a questão. Eu não deveria ter que escrever meu código de forma diferente, incluindo uma sintaxe feia e hacky, apenas para apaziguar uma extensão IDE, quando o que escrevi estava certo desde o início.

Tenho exatamente o mesmo problema e mensagem com este código semelhante:

class MyComponent {
  form: FormGroup;
}

com linhas como esta no modelo:

<app-errors [control]="form.controls.email">

Mensagem de erro :

O identificador 'email' não foi definido. '__type' não contém tal membro

O problema é causado por campos do tipo (ocorre com AbstractControl ou outra coisa, é claro):

{  [key: string]: AbstractControl;  };

Eu tenho esta mensagem no Visual Studio Code (Windows) e Angular Language Services, mas não com ng lint .

Melhor solução até agora:

Tente prefixar "!!".
Embora seja complicado,
Eu consegui dessa forma.

image

_from: https://github.com/angular/vscode-ng-language-service/issues/126#issuecomment -366200219_

Obrigado tmrony, melhor solução depois de muitos dias pesquisando ...

Na verdade é para ser assim, o destaque do erro é mostrado porque a propriedade "errors" de "AbstractControl" não tem propriedades estritamente definidas, é do tipo " ValidationErrors "

Portanto, acessar diretamente uma regra de validação está causando o erro; no meu caso, acessá-la usando a notação de colchetes resolve o problema.

(btw, mesmo se eu acessar a propriedade de validação diretamente, não estou recebendo erros de compilação, o aplicativo funciona bem de qualquer maneira)

image

A outra maneira de fazer isso é usar o método "hasError" do controle:

   <span *ngIf="(firstName.dirty || firstName.touched) && firstName.hasError('required')">First name is required.</span>

@ boban984 A solução funcionou ....

A solução

"price.errors ['required']" -> Trabalhou
"!! price.errors.required" -> Trabalhou

"price? .errors? .required" também deve funcionar, porque meu "fullname? .errors? .required" funciona

"price.errors ['required']" -> Trabalhou

Isso não aciona o compilador 'identificador não está definido' mas não é uma boa solução, pois se o objeto de erros for nulo, ocorrerá um erro no console sobre ele.

@ boban984
esta é a solução e explicação vencedora.

Fiquei feliz em encontrar o método hasError() discutido aqui, é certamente a maneira mais clara de mostrar a intenção do modelo condicional e acho que tentarei usá-lo exclusivamente daqui para frente.

No entanto ... ninguém está abordando a causa raiz do problema, e ele tem sido um problema com o serviço de idiomas há cerca de um ano. A propriedade errors tem uma assinatura de índice de chave ( [key: string]: any ), o que significa que no código TS, a instrução myControl.errors.anythingYouLike será compilada de forma limpa, não importa quais sinalizadores de modo estrito você tenha definido . Isso está correto, porque o objetivo de ter uma assinatura de índice como essa é ser capaz de criar propriedades arbitrárias em tempo de execução e acessá-las por notação de ponto ou notação de índice. O serviço de linguagem permite a notação de índice, razão pela qual control?.errors['required'] funciona, mas sinaliza a notação de ponto como incorreta, o que é um erro.

três soluções:

<span *ngIf=" username.errors['email']">must be email</span>

<span *ngIf="!!username?.errors.email">must be email</span>

<span *ngIf="username.hasError('email')">must be email</span>

Eu gosto do terceiro melhor

@ boban984 Ótima solução e explicação

obrigado, funciona para mim !. 👍🏼
eu odeio visualizar erros no console 😬

Olá, tente assim.
Form.hasError ('obrigatório');

Esta foi a solução mais elegante e realmente funciona para todos os casos: myForm.hasError ('required', 'myField').

Obrigado @antonheck

Olá, tente assim.
Form.hasError ('obrigatório');

Esta foi a solução mais elegante e realmente funciona para todos os casos: myForm.hasError ('required', 'myField').

Funciona, mas a melhor solução baseada na simplicidade foi oferecida por @ boban984 : "myField.hasError ('required')". :)

Resolvi este problema desta forma:

  • example.component.ts:
this.myForm = this.formBuilder.group({
      field: ['', [Validators.required, Validators.maxLength(10)]]
});

get getField() { return this.myForm.get('field'); }
  • example.component.html:
<div *ngIf="getField.errors" class="invalid-feedback">
  <div *ngIf="getField.hasError('required')"> Text required </div>
  <div *ngIf="getField.hasError('maxlength')"> Text maxLength </div>
</div>

Espero ser útil.

Perfeito @bePericon isso funciona para mim!
Obrigado!

<input type="text" formControlName="name" class="form-control" placeholder="Full name"> <div *ngIf="submitted && f['name'].errors" class="alert alert-danger"> <div *ngIf="f['name'].errors.required">Full Name is required</div> </div>
Isso funcionou para mim no Angular 7

Então, depois de dois anos, não foi corrigido? 🤣
relacionado: https://github.com/angular/vscode-ng-language-service/issues/110

Então, depois de dois anos, não foi corrigido? 🤣
relacionado: # 110

Não é um bug, é exatamente como deveria funcionar

Se esta é a funcionalidade esperada, a documentação pode ser atualizada? (veja aqui um exemplo).

Isso infere claramente que os acessadores de propriedade brutos de ngModel podem ser usados, onde este segmento estabeleceu que eles definitivamente não podem.

Na verdade, está consertado? Mudei para hasError há muito tempo, mas agora estou tentando, sem sucesso, reproduzir o erro. myControl.errors.maxlength não gera nenhum squiggly vermelho para mim. Isso é com a extensão de serviço de idioma 0.801.1, que usa a v8.1.x da biblioteca, se isso ajudar.

@ thw0rted então, após novo teste com myControl.errors.required e .pattern e (percebi que perdi o atributo required na tag de entrada, o que estava causando uma falha maior), eles não bastante trabalho.

Required principalmente funciona, embora tenham surgido alguns erros estranhos (não foram capturados e eles são inconsistentes, infelizmente) e pattern dispara quando o padrão está errado, mas não parece se atualizar quando o padrão está correto.

Além disso, tenho a mesma extensão de linguagem vsCode e ainda vejo rabiscos estranhamente.

Vou ficar com a solução .hasError por enquanto e provavelmente ainda recomendaria que os documentos fossem atualizados, pelo menos para ter isso como um uso mais claro / de prática recomendada.

Descobri que esse erro aparece sempre que você faz referência a uma propriedade definida como 'qualquer'. Outra solução alternativa é usar a anotação de propriedade de colchetes, clientFirstName? .Errors ['required'] que também é muito estúpida.

Isso removeu os erros para mim. Para referência, o código funcionou mesmo quando os erros foram descritos, só não gosto de ver linhas vermelhas no meu código.

Sim, colocar a chave como uma string remove as linhas vermelhas.

Mas você perde recursos como ortografia correta e preenchimento automático com isso.

além de usar hasError (), acessar o controle filho de um formulário deve usar get () em vez de acesso de ponto. por exemplo

class MyComponent {
  form: FormGroup;
}

com linhas como esta no modelo:

<app-errors [control]="form.controls.email">

Mensagem de erro :

O identificador 'email' não foi definido. '__type' não contém tal membro

solução seria:

<app-errors [control]="form.get('email')">

O mesmo problema.

Falha de f.email.errors.email.required
!! f.email.errors.email.required Fails
f.email?.errors.email.required Fails
f? .email? .errors.email.required Falhas
f.email.error. ['obrigatório'] Falha
f.email?.error.['required '] Falha

Isso funcionou para mim:

f ['email']. errors.required

Este problema foi bloqueado automaticamente devido à inatividade.
Registre um novo problema se você estiver encontrando um problema semelhante ou relacionado.

Leia mais sobre nossa política de bloqueio automático de conversas .

_Esta ação foi executada automaticamente por um bot._

Esta página foi útil?
0 / 5 - 0 avaliações