Vscode-ng-language-service: Admite el encadenamiento opcional en la plantilla

Creado en 18 ago. 2017  ·  70Comentarios  ·  Fuente: angular/vscode-ng-language-service

en 0.1.4 en Windows 10

errors?.required se resalta como un error

Se requiere el nombre

image

bug

Comentario más útil

esto funcionó para mí:

Espero que te ayude.

Todos 70 comentarios

También sucede en OS X 10.11.6 (El Capitan).

SO: OS X 10.11.6
Versión de extensión: 0.1.4
Versión de VS Code: 1.15.1

También tengo este problema en Windows 10 x64
Versión de extensión 0.1.7
VS Code versión 1.15.1
Por favor arréglalo pronto

El mismo problema aqui.
El error es: 'Error de identificador' no está definido. 'NgModel' no contiene tal miembro '.

SO: macOS 10.13
Extensión: 0.1.7
Código VS: 1.16.1
Angular: 4.4.3
Texto mecanografiado: 2.5.2

¡El mismo problema! ¿Alguna solución?

¿Debo importarlo en el módulo de aplicación o en mi componente donde existe el formulario?

Las importaciones de @ angular / forms mencionadas por @VladBozhinovski no lo resolverán.
Tipo de relacionado: https://github.com/angular/vscode-ng-language-service/issues/179

Sí, tampoco me funcionó ...

tengo el mismo problema ... ¿alguna solución?

Mismo problema, ¿alguien ha encontrado una solución?

El mismo problema aquí. ¿Alguna idea todavía?

También tengo este problema alguna solución.

Igual que aquí.

parece que no estoy solo :)

Mucha gente tiene este problema. Ustedes pueden evitarlo como 'correo electrónico? .Error.required'

@ Duanthse03268 esto funcionó al eliminar el error de la línea roja pero aún así

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)

Asegúrate de importar
importar {FormsModule, Validators} desde '@ angular / forms';

Ninguna de las soluciones de este hilo resuelve el problema. Hice un ejemplo lo más simple posible para asegurarme de que nada más lo estropeara:

screen shot 2018-01-08 at 22 56 53

FormModule y Validators se han importado desde @ angular / forms. También probé esta solución por @ Duanthse03268 , y no solo no resuelve el problema de la línea roja, sino que también causa un error en la consola cuando cambia el estado de myField (TypeError: No se puede leer la propiedad 'requerida' de nulo) si se usa sin el '?' después de 'errores'.

Mi implementación funciona sin errores en el navegador, pero conserva la línea roja (supuestamente incorrecta) en el editor (VSCode). Resumen de los archivos en cuestión (todo lo demás que puede simplemente 'ng nuevo ...' para reproducir):

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

Versiones:

Extensión: 0.1.7
VSCode: 1.19.1
CLI angular: 1.6.3
Nodo: 9.2.1
SO: macOS 10.12.6
Angular: 5.1.3
Cromo: 63.0.3239.84

¿Por qué no intentó utilizar 'myfield? .Error.required'.

Lo intenté, tal como escribí en mi comentario anterior: "no solo no resuelve el problema de la línea roja, sino que también causa un error en la consola cuando cambia el estado de myField (TypeError: No se puede leer la propiedad 'requerida' de null ) ".

Entonces, para desarrollar, 'myField? .Errors.required' no funciona y hace que el mensaje de error anterior se muestre en la consola. Los '?' debe escribirse después de "errores" para que este código funcione en el navegador sin mensaje de error, pero no resuelve el problema original de la línea roja incorrecta en el editor.

Esto es extremadamente molesto ya que las líneas rojas siguen ahí, pero la funcionalidad funciona. Estoy de acuerdo con joonashak ya que las soluciones presentadas no funcionan y probar ambos formatos no resuelve el problema.

esto funcionó para mí:

Espero que te ayude.

Solo soluciones provisionales :(

IntelliJ arroja el mismo error para mí. Pero la implementación funciona incluso con los errores en el navegador. La solución alternativa de @Ahnset funcionó para mí. ¿Le gustaría saber qué es esta sintaxis y cómo funciona ahora?

Descubrí que este error aparece cada vez que hace referencia a una propiedad que se define como 'cualquiera'. Otra solución alternativa es usar la anotación de propiedad de corchetes, clientFirstName? .Errors ['required'] que también es bastante estúpido.

Se está poniendo peor, con la última actualización de vscode, mi árbol de archivos se parece más a un árbol de navidad: árbol_navidad:

@adickenscheidt gracias por la solución. Funciona muy bien, de acuerdo tonto por ahora.

eliminado Angular Language Service ...

@ Duanthse03268 ¡ Tu función funciona! Gracias.

@adickenscheidt
Gracias, esta solución funciona para mí.

Funcionó. Muy apreciado @ Duanthse03268

@ Duanthse03268 ¡ Tu función funciona! ¿Pero eso qué significa exactamente?

No funciona para la propiedad de objeto anidado
<mat-select [(ngModel)]="object?.nestedObject?.property" name="property" #property="ngModel">
obteniendo errores de análisis supercool en object?.object?.property

Yo uso esto. Feo pero funciona.
name?.errors && name?.errors['required']

email.errors ['required'] funcionó para mí

@ guignol1981 La solución funcionó para mí.

Usar esto funcionó para mí:

¿Solo el nombre del elemento necesita? Marcos. No es tan feo

Tengo el mismo problema, pero ninguna de las soluciones propuestas ha funcionado:
"formulario? .get ('nombre'). errors.required"
"formulario? .get ('nombre'). errores. ['obligatorio']"
"formulario? .get ('nombre'). errores? .requiere"

Hola, inténtalo así.
Form.hasError ('obligatorio');

Eso funcionó para mí. Gracias @antonheck

hay algunas soluciones, cada una mejor para situaciones diferentes, sí. Pero ese no es el problema. No debería tener que escribir mi código de manera diferente, incluido el sintaxe feo y hacky, solo para apaciguar una extensión IDE, cuando lo que escribí fue correcto desde el principio.

Tengo exactamente el mismo problema y mensaje con este código similar:

class MyComponent {
  form: FormGroup;
}

con líneas como esta en la plantilla:

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

Mensaje de error :

El identificador 'correo electrónico' no está definido. '__type' no contiene tal miembro

El problema es causado por campos de tipo como (ocurre con AbstractControl o algo más, por supuesto):

{  [key: string]: AbstractControl;  };

Tengo este mensaje en Visual Studio Code (Windows) y Angular Language Services, pero no con ng lint .

La mejor solución hasta ahora:

Intente anteponer "!!".
Aunque es complicado,
Lo logré de esta manera.

image

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

Gracias tmrony, la mejor solución después de muchos días buscando ...

En realidad, se supone que es así, el resaltado de error se muestra porque la propiedad "errors" de "AbstractControl" no tiene propiedades estrictamente definidas, es del tipo " ValidationErrors "

Entonces, acceder directamente a una regla de validación está causando el error, en mi caso, acceder a ella usando la notación de corchetes resuelve el problema.

(por cierto, incluso si accedo a la propiedad de validación directamente, no obtengo errores de compilación, la aplicación funciona bien de cualquier manera)

image

La otra forma de hacer esto es usar el método "hasError" del control:

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

@ boban984 La solución funcionó ....

@adickenscheidt ¡La solución funcionó para mí! Gracias

"price.errors ['required']" -> Funcionó
"!! price.errors.required" -> Funcionó

"precio? .errores? .requerido" también debería funcionar, porque mi "nombre completo? .errores? .requerido" funciona

"price.errors ['required']" -> Funcionó

Eso no activa el compilador 'el identificador no está definido' pero no es una buena solución, porque si el objeto de errores es nulo, se producirá un error en la consola al respecto.

@ boban984
esta es la solución y la explicación ganadoras.

Me alegré de encontrar el método hasError() discutido aquí, sin duda es la forma más clara de mostrar la intención de la plantilla condicional y creo que intentaré usarlo exclusivamente en el futuro.

Sin embargo ... nadie está abordando la causa raíz del problema, y ​​ha sido un problema con el servicio de idiomas durante algo así como un año. La propiedad errors tiene una firma de índice clave ( [key: string]: any ), lo que significa que en el código TS, la declaración myControl.errors.anythingYouLike se compilará limpiamente, sin importar qué indicadores de modo estricto haya establecido . Esto es correcto, porque el objetivo de tener una firma de índice como esa es poder crear propiedades arbitrarias en tiempo de ejecución y acceder a ellas mediante notación de puntos o notación de índice. El servicio de idiomas permite la notación de índices, por lo que control?.errors['required'] funciona, pero marca la notación de puntos como incorrecta, lo cual es un error.

tres soluciones:

<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>

Me gusta el tercero mejor

@ boban984 Gran solución y explicación

gracias, funciona para mi !. 👍🏼
Odio ver los errores en la consola

Hola, inténtalo así.
Form.hasError ('obligatorio');

Esta fue la solución más elegante y realmente funciona para todos los casos: myForm.hasError ('required', 'myField').

Gracias @antonheck

Hola, inténtalo así.
Form.hasError ('obligatorio');

Esta fue la solución más elegante y realmente funciona para todos los casos: myForm.hasError ('required', 'myField').

Funciona, pero la mejor solución basada en la simplicidad la ofreció @ boban984 : "myField.hasError ('required')". :)

Resolví este problema de esta manera:

  • 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 de ayuda.

Perfecto @bePericon, ¡ esto funciona para mí!
¡Gracias!

<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>
Esto funcionó para mí en Angular 7

Entonces, después de dos años, ¿no se ha solucionado? 🤣
relacionado: https://github.com/angular/vscode-ng-language-service/issues/110

Entonces, después de dos años, ¿no se ha solucionado? 🤣
relacionado: # 110

No es un error, es exactamente como debería funcionar

Si esta es la funcionalidad esperada, ¿se puede actualizar la documentación? (vea aquí un ejemplo).

Esto claramente infiere que los accesos de propiedad en bruto de ngModel pueden usarse, donde este hilo ha establecido que definitivamente no pueden.

¿Está realmente arreglado? Cambié a hasError hace mucho tiempo, pero ahora estoy intentando y no puedo reproducir el error. myControl.errors.maxlength no genera ningún ondulado rojo para mí. Esto es con la extensión del servicio de idiomas 0.801.1, que usa v8.1.x de la biblioteca, si eso ayuda.

@ thw0rted así que, al volver a probar con myControl.errors.required y .pattern y (me di cuenta de que me perdí el atributo required en la etiqueta de entrada, que estaba causando una falla mayor), no bastante trabajo.

Required su mayoría funciona, aunque hubo algunos errores extraños que aparecieron (no se capturaron y son inconsistentes, desafortunadamente), y pattern activa cuando el patrón es incorrecto pero no parece actualizarse cuando el patrón es correcto.

Además, tengo la misma extensión de idioma vsCode, y todavía veo garabatos de manera extraña.

Seguir con la solución .hasError por el momento, y probablemente aún recomendaría que los documentos se actualicen, al menos para tenerlo como un uso más claro / de mejores prácticas.

Descubrí que este error aparece cada vez que hace referencia a una propiedad que se define como 'cualquiera'. Otra solución alternativa es usar la anotación de propiedad de corchetes, clientFirstName? .Errors ['required'] que también es bastante estúpido.

Esto me quitó los errores. Como referencia, el código funcionó incluso cuando se describieron los errores, simplemente no me gusta ver líneas rojas en mi código.

Sí, al introducir la clave como una cuerda se eliminan las líneas rojas.

Pero pierde características como la ortografía correcta y la autocompletación con esto.

Además de usar hasError (), acceder al control secundario de un formulario debe usar get () en lugar de acceso de puntos. p.ej

class MyComponent {
  form: FormGroup;
}

con líneas como esta en la plantilla:

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

Mensaje de error :

El identificador 'correo electrónico' no está definido. '__type' no contiene tal miembro

la solución sería:

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

Mismo problema.

f.email.errors.email.required Fallos
!! f.email.errors.email.required Fails
f.email?.errors.email.required Fails
f? .email? .errors.email.required Fails
f.email.error. ['required'] falla
f.email?.error.[required '] falla

Esto funcionó para mí:

f ['email']. errors.required

Este problema se ha bloqueado automáticamente debido a la inactividad.
Por favor, presente un nuevo problema si se encuentra con un problema similar o relacionado.

Obtenga más información sobre nuestra política de bloqueo automático de conversaciones .

_Esta acción ha sido realizada automáticamente por un bot._

¿Fue útil esta página
0 / 5 - 0 calificaciones