Vscode-ng-language-service: Unterstützt optionale Verkettung in der Vorlage

Erstellt am 18. Aug. 2017  ·  70Kommentare  ·  Quelle: angular/vscode-ng-language-service

in 0.1.4 unter Windows 10

errors?.required wird als Fehler hervorgehoben

Name ist erforderlich

image

bug

Hilfreichster Kommentar

das hat bei mir funktioniert:

Ich hoffe es hilft dir.

Alle 70 Kommentare

Auch unter OS X 10.11.6 (El Capitan).

Betriebssystem: OS X 10.11.6
Erweiterungsversion: 0.1.4
VS-Code-Version: 1.15.1

Ich habe dieses Problem auch unter Windows 10 x64
Erweiterungsversion 0.1.7
VS Code Version 1.15.1
Bitte beheben Sie es bald

Selbes Problem hier.
Fehler ist: 'Bezeichner' Fehler 'ist nicht definiert. 'NgModel' enthält kein solches Mitglied '.

Betriebssystem: macOS 10.13
Erweiterung: 0.1.7
VS-Code: 1.16.1
Winkel: 4.4.3
Typoskript: 2.5.2

Gleiches Problem! Irgendeine Lösung?

Soll ich es in die app.module oder in meine Komponente importieren, in der das Formular vorhanden ist?

Die von @VladBozhinovski erwähnten @ Forms- Importe lösen das
Art der verwandten: https://github.com/angular/vscode-ng-language-service/issues/179

Ja, hat mir auch nicht geholfen ...

Ich habe das gleiche Problem ... irgendeine Lösung?

Gleiches Problem, hat jemand eine Lösung gefunden?

Gleiches Problem hier. Irgendwelche Ideen schon?

Ich habe auch für dieses Problem keine Lösungen bekommen

Hier gilt das gleiche.

es scheint, als wäre ich nicht allein :)

So viele Leute haben dieses Problem. Ihr könnt es verhindern wie "E-Mail? .Fehler.erfordert"

@ Duanthse03268 dies funktionierte durch Entfernen des roten

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)

Stellen Sie sicher, dass Sie importieren
{FormsModule, Validators} aus '@ angle / forms' importieren;

Keine der Lösungen in diesem Thread behebt das Problem. Ich habe ein Beispiel so einfach wie möglich gemacht, um sicherzustellen, dass nichts anderes es vermasselt:

screen shot 2018-01-08 at 22 56 53

FormModule und Validators wurden aus @ angle / forms importiert. Ich habe diese Lösung auch von @ Duanthse03268 getestet und

Meine Implementierung funktioniert fehlerfrei im Browser, behält jedoch die (angeblich falsche) rote Linie im Editor (VSCode) bei. Liste der fraglichen Dateien (alles andere, was Sie einfach neu reproduzieren können):

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

Versionen:

Erweiterung: 0.1.7
VSCode: 1.19.1
Angular CLI: 1.6.3
Knoten: 9.2.1
Betriebssystem: macOS 10.12.6
Winkel: 5.1.3
Chrome: 63.0.3239.84

Warum haben Sie nicht versucht, "myfield? .Ferror.required" zu verwenden.

Ich habe es versucht, genau wie ich in meinem vorherigen Kommentar geschrieben habe: "Es behebt nicht nur nicht das Problem der roten Linie, sondern verursacht auch einen Fehler in der Konsole, wenn sich der Status von myField ändert (TypeError: Eigenschaft 'erforderlich' von null kann nicht gelesen werden ) ".

Um dies zu erläutern, funktioniert 'myField? .Errors.required' nicht und führt dazu, dass die obige Fehlermeldung in der Konsole angezeigt wird. Das '?' muss nach 'error' geschrieben werden, damit dieser Code im Browser ohne Fehlermeldung funktioniert, löst jedoch nicht das ursprüngliche Problem der falschen roten Linie im Editor.

Dies ist äußerst ärgerlich, da die roten Linien immer noch vorhanden sind, die Funktionalität jedoch funktioniert. Ich stimme joonashak zu, da die vorgestellten Lösungen nicht funktionieren und das Ausprobieren beider Formate das Problem nicht löst.

das hat bei mir funktioniert:

Ich hoffe es hilft dir.

Nur Problemumgehungen :(

IntelliJ wirft den gleichen Fehler für mich. Die Implementierung funktioniert aber auch mit den Fehlern im Browser. Workaround von @Ahnset hat bei mir funktioniert. Möchten Sie wissen, was diese Syntax ist und wie sie jetzt funktioniert?

Ich habe festgestellt, dass dieser Fehler jedes Mal auftritt, wenn Sie auf eine Eigenschaft verweisen, die als "any" definiert ist. Eine andere Problemumgehung ist die Verwendung der Annotation der Klammer-Eigenschaft clientFirstName? .Ferrors ['erforderlich'], was ebenfalls ziemlich dumm ist.

Mit dem neuesten Update von vscode wird mein Dateibaum immer schlimmer wie ein Weihnachtsbaum: christmas_tree:

@adickenscheidt danke für die Problemumgehung. Funktioniert super, stimme erstmal dumm zu.

Angular Language Service entfernt ...

@ Duanthse03268 Deine Funktion funktioniert! Vielen Dank.

@adickenscheidt
Vielen Dank, dass diese Lösung für mich funktioniert

Es funktionierte. Sehr geschätzt

@ Duanthse03268 Deine Funktion funktioniert! Aber was bedeutet das genau?

Es funktioniert nicht für verschachtelte Objekteigenschaften
<mat-select [(ngModel)]="object?.nestedObject?.property" name="property" #property="ngModel">
Erhalten von supercoolen Analysefehlern für object?.object?.property

Ich benutze das. Hässlich aber funktioniert.
name?.errors && name?.errors['required']

email.errors ['erforderlich'] hat bei mir funktioniert

@ guignol1981 Lösung hat bei mir funktioniert.

Das hat bei mir funktioniert:

Nur der Elementname benötigt das? Kennzeichen. Es ist nicht so hässlich

Ich habe das gleiche Problem, aber keine der vorgeschlagenen Lösungen hat funktioniert:
"form? .get ('name'). error.required"
"Formular? .get ('Name'). Fehler. ['Erforderlich']"
"Formular? .get ('Name'). Fehler? .erforderlich"

Hallo, versuche es so.
Form.hasError ('erforderlich');

Das hat bei mir funktioniert. Danke @antonheck

Es gibt ein paar Problemumgehungen, jede besser für unterschiedliche Situationen, ja. Aber das ist nicht das Problem. Ich sollte meinen Code nicht anders schreiben müssen, einschließlich hässlicher, hackiger Sintaxe, nur um eine IDE-Erweiterung zu beschwichtigen, wenn das, was ich geschrieben habe, von Anfang an richtig war.

Ich habe genau das gleiche Problem und die gleiche Meldung mit diesem ähnlichen Code:

class MyComponent {
  form: FormGroup;
}

mit Zeilen wie diesen in der Vorlage:

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

Fehlermeldung :

Die Kennung 'E-Mail' ist nicht definiert. '__type' enthält kein solches Mitglied

Das Problem wird durch Felder vom Typ verursacht (es tritt natürlich bei AbstractControl oder etwas anderem auf):

{  [key: string]: AbstractControl;  };

Ich habe diese Nachricht in Visual Studio Code (Windows) und Angular Language Services, aber nicht mit ng lint .

Beste Lösung bisher:

Versuchen Sie, "!!" voranzustellen.
Obwohl es schwierig ist,
Das ist mir gelungen.

image

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

Danke tmrony, beste Lösung nach vielen Tagen Suche ...

Eigentlich soll es so sein, das Fehler-Highlight wird angezeigt, weil die "Fehler" -Eigenschaft von "AbstractControl" keine streng definierten Eigenschaften hat, sondern vom Typ " ValidationErrors " ist.

Der direkte Zugriff auf eine Validierungsregel führt also zu dem Fehler. In meinem Fall wird das Problem durch den Zugriff mit der eckigen Klammer behoben.

(Übrigens, selbst wenn ich direkt auf die Validierungseigenschaft zugreife, erhalte ich keine Kompilierungsfehler, funktioniert die App in beiden Fällen einwandfrei.)

image

Die andere Möglichkeit besteht darin, die "hasError" -Methode des Steuerelements zu verwenden:

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

@ boban984 Lösung funktioniert ....

@adickenscheidt Lösung hat bei mir funktioniert! Vielen Dank

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

"Preis? Fehler? Erforderlich" sollte auch funktionieren, da mein "vollständiger Name? Fehler? Erforderlich" funktioniert

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

Das löst nicht aus, dass der Compiler "Bezeichner ist nicht definiert" ist, aber es ist keine gute Lösung, denn wenn das Fehlerobjekt null ist, wird es in der Konsole einen Fehler verursachen.

@ boban984
Dies ist die Gewinnerlösung und Erklärung.

Ich war froh, die hier diskutierte hasError() -Methode zu finden. Es ist sicherlich der klarste Weg, die Absicht der Vorlage unter bestimmten Bedingungen zu zeigen, und ich denke, ich werde versuchen, sie in Zukunft ausschließlich zu verwenden.

Jedoch ... niemand spricht die Grundursache des Problems an, und es ist seit ungefähr einem Jahr ein Problem mit dem Sprachdienst. Die errors -Eigenschaft hat eine Schlüsselindexsignatur ( [key: string]: any ), was bedeutet, dass im TS-Code die Anweisung myControl.errors.anythingYouLike sauber kompiliert wird, unabhängig davon, welche Strict-Mode-Flags Sie gesetzt haben . Dies ist richtig, da der Sinn einer solchen Indexsignatur darin besteht, zur Laufzeit beliebige Eigenschaften erstellen und entweder durch Punktnotation oder Indexnotation darauf zugreifen zu können. Der Sprachdienst ermöglicht die Indexnotation, weshalb control?.errors['required'] funktioniert, kennzeichnet jedoch die Punktnotation als falsch, was ein Fehler ist.

drei Lösungen:

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

Ich mag das drittbeste

@ boban984 Tolle Lösung und Erklärung

Danke, arbeitet für mich!. 👍🏼
Ich hasse es, Fehler auf der Konsole anzuzeigen 😬

Hallo, versuche es so.
Form.hasError ('erforderlich');

Dies war die eleganteste Lösung und funktioniert wirklich in allen Fällen: myForm.hasError ('erforderlich', 'myField').

Danke @antonheck

Hallo, versuche es so.
Form.hasError ('erforderlich');

Dies war die eleganteste Lösung und funktioniert wirklich in allen Fällen: myForm.hasError ('erforderlich', 'myField').

Es funktioniert, aber die beste Lösung, die auf Einfachheit basiert, wurde von @ boban984 angeboten : "myField.hasError ('erforderlich')". :) :)

Ich habe dieses Problem folgendermaßen gelöst:

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

Ich hoffe hilfreich zu sein.

Perfektes @bePericon das funktioniert bei mir!
Vielen Dank!

<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>
Dies hat bei mir in Angular 7 funktioniert

Also nach zwei Jahren wurde es nicht behoben? 🤣
Verwandte: https://github.com/angular/vscode-ng-language-service/issues/110

Also nach zwei Jahren wurde es nicht behoben? 🤣
verwandt: # 110

Es ist kein Fehler, es ist genau so, wie es funktionieren sollte

Kann die Dokumentation aktualisiert werden, wenn dies erwartete Funktionalität ist? (siehe hier für ein Beispiel).

Dies lässt eindeutig darauf schließen, dass die Raw-Property-Accessoren von ngModel verwendet werden können, wenn dieser Thread festgestellt hat, dass dies definitiv nicht möglich ist.

Ist es eigentlich behoben? Ich habe vor langer Zeit zu hasError gewechselt, aber jetzt versuche ich, den Fehler zu reproduzieren. myControl.errors.maxlength erzeugt für mich kein rotes Schnörkel. Dies ist mit der Sprachdiensterweiterung 0.801.1 möglich, die v8.1.x der Bibliothek verwendet, sofern dies hilfreich ist.

@ thw0rted also, beim myControl.errors.required und .pattern und (festgestellt, dass ich das Attribut required auf dem Eingabe-Tag verpasst habe, was einen größeren Fehler verursacht hat), tun sie dies nicht ziemlich arbeiten.

Required funktioniert meistens, obwohl einige seltsame Fehler aufgetreten sind (sie wurden nicht erfasst und sind leider inkonsistent), und pattern ausgelöst, wenn das Muster falsch ist, aber nicht aktualisiert zu werden scheint wenn das Muster korrekt ist.

Außerdem habe ich die gleiche vsCode-Spracherweiterung und sehe immer noch seltsamerweise Kringel.

Ich werde mich im Moment an die .hasError -Lösung halten und würde wahrscheinlich immer noch empfehlen, die Dokumente zu aktualisieren, zumindest um dies als klarere / bewährte Methode zu verwenden.

Ich habe festgestellt, dass dieser Fehler jedes Mal auftritt, wenn Sie auf eine Eigenschaft verweisen, die als "any" definiert ist. Eine andere Problemumgehung ist die Verwendung der Annotation der Klammer-Eigenschaft clientFirstName? .Ferrors ['erforderlich'], was ebenfalls ziemlich dumm ist.

Dies beseitigte die Fehler für mich. Als Referenz funktionierte der Code auch dann, wenn die Fehler umrissen wurden. Ich mag es einfach nicht, rote Linien in meinem Code zu sehen.

Ja, wenn Sie den Schlüssel als Zeichenfolge eingeben, werden die roten Linien entfernt.

Aber Sie verlieren damit Funktionen wie korrekte Rechtschreibung und automatische Vervollständigung.

Zusätzlich zur Verwendung von hasError () sollte für den Zugriff auf das untergeordnete Steuerelement eines Formulars get () anstelle des Punktzugriffs verwendet werden. z.B

class MyComponent {
  form: FormGroup;
}

mit Zeilen wie diesen in der Vorlage:

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

Fehlermeldung :

Die Kennung 'E-Mail' ist nicht definiert. '__type' enthält kein solches Mitglied

Lösung wäre:

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

Gleicher Fehler.

f.email.errors.email.required schlägt fehl
!! f.email.errors.email.required schlägt fehl
f.email?.errors.email.required schlägt fehl
f? .email? .errors.email.required schlägt fehl
f.email.error. ['erforderlich'] schlägt fehl
f.email?.error.['required '] schlägt fehl

Das hat bei mir funktioniert:

f ['email']. error.required

Dieses Problem wurde aufgrund von Inaktivität automatisch gesperrt.
Bitte reichen Sie ein neues Problem ein, wenn Sie auf ein ähnliches oder verwandtes Problem stoßen.

Lesen Sie mehr über unsere Richtlinien zum automatischen Sperren von Konversationen .

_Diese Aktion wurde automatisch von einem Bot ausgeführt._

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen