Vscode-ng-language-service: 支持模板中的可选链接

创建于 2017-08-18  ·  70评论  ·  资料来源: angular/vscode-ng-language-service

在Windows 10上的0.1.4中

errors?.required被突出显示为错误

名称为必填项

image

最有用的评论

这为我工作:

希望对您有帮助。

所有70条评论

也在OS X 10.11.6(El Capitan)上发生。

作业系统:OS X 10.11.6
扩展版本:0.1.4
VS Code版本:1.15.1

我在Windows 10 x64上也遇到了这个问题
扩展版本0.1.7
VS Code版本1.15.1
请尽快修复

这里同样的问题。
错误是:未定义“标识符”错误。 “ NgModel”不包含此类成员。

作业系统:macOS 10.13
扩展名:0.1.7
VS代码:1.16.1
角度:4.4.3
打字稿:2.5.2

同样的问题! 有什么办法吗?

我应该将其导入app.module或存在表单的组件中吗?

@VladBozhinovski提到的@ angular / forms导入无法解决。
相关种类: https :

是的,我也没有工作...

我有同样的问题..任何解决方案?

同一期,有人找到解决方法了吗?

同样的问题在这里。 有什么想法吗?

我也有这个问题的任何解决方案

同样在这里。

似乎我并不孤单:)

这么多人遇到了这个问题。 你们可以阻止它,例如“ email?.error.required”

@ Duanthse03268通过消除红线错误可以

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)

确保您导入
从'@ angular / forms'导入{FormsModule,Validators};

此线程中的任何解决方案都不能解决问题。 我尽可能简化了一个示例,以确保没有其他混乱的情况:

screen shot 2018-01-08 at 22 56 53

FormModule和验证器已从@ angular / forms导入。 我还通过@ Duanthse03268测试了此解决方案,它不仅不能解决红线问题,而且如果在不使用myField的情况下使用myField的状态发生更改(TypeError:无法读取属性'required',则为null)也会在控制台中导致错误。 '?' 在“错误”之后。

我的实现在浏览器中没有错误,但在编辑器(VSCode)中保留了(据说不正确)红线。 有问题的文件的要点(您可以通过“ ng new ...”复制所有其他内容):

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

版本:

扩展名:0.1.7
VSCode:1.19.1
角CLI:1.6.3
节点:9.2.1
作业系统:macOS 10.12.6
角度:5.1.3
铬:63.0.3239.84

您为什么不尝试使用'myfield?.error.required'。

我确实做了尝试,就像我在先前的评论中所写的那样:“不仅无法解决红线问题,而且当myField的状态更改时,它还会在控制台中导致错误(TypeError:无法读取null的'required'属性)”。

因此,详细来说,“ myField?.errors.required”不起作用,并导致上述错误消息显示在控制台中。 这 '?' 必须在“错误”之后编写代码,以使此代码在浏览器中运行而不会出现错误消息,但仍不能解决编辑器中红线不正确的原始问题。

这仍然很烦人,因为红线仍然存在,但是功能正常。 我同意joonashak,因为提出的解决方案不起作用,尝试两种格式都不能解决问题。

这为我工作:

希望对您有帮助。

唯一的解决方法:(

IntelliJ为我抛出相同的错误。 但是即使浏览器中的错误也可以实现。 @Ahnset的解决方法为我工作。 想知道这个语法是什么,现在如何工作?

我发现,每当您引用定义为“ any”的属性时,都会出现此错误。 另一个解决方法是使用括号属性注释clientFirstName?.errors ['required'],它也很愚蠢。

最糟糕的是,随着vscode的最新更新,我的文件树变得更像圣诞树了:christmas_tree:

@adickenscheidt感谢您的解决方法。 效果很好,暂时同意。

删除了Angular Language Service ...

@ Duanthse03268您的功能正常运行! 谢谢。

@adickenscheidt
谢谢这个解决方案为我工作

有效。 非常感谢@ Duanthse03268

@ Duanthse03268您的功能正常运行! 但这到底是什么意思?

它不适用于嵌套对象属性
<mat-select [(ngModel)]="object?.nestedObject?.property" name="property" #property="ngModel">
object?.object?.property上获得过冷的解析错误

我用这个丑陋但可行。
name?.errors && name?.errors['required']

email.errors ['required']为我工作

@ guignol1981解决方案为我工作。

使用这个为我工作:

只有元素名称需要? 标记。 不太丑

我有同样的问题,但是没有一个建议的解决方案起作用:
“ form?.get('name')。errors.required”
“表单?.get('name')。错误。['必需']”
“ form?.get('name')。errors..required”

您好尝试这样。
Form.hasError('required');

那对我有用。 谢谢@antonheck

有一些变通办法,每个变通办法都适合于不同情况,是的。 但这不是问题。 当我从一开始就编写正确的代码时,我不必以不同的方式编写代码,包括丑陋的,骇人的sintaxe,而只是为了安抚IDE扩展。

我有与此类似的代码完全相同的问题和消息:

class MyComponent {
  form: FormGroup;
}

在模板中带有这样的行:

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

错误信息 :

未定义标识符“电子邮件”。 '__type'不包含此类成员

问题是由类似类型的字段引起的(它发生在AbstractControl或其他东西中):

{  [key: string]: AbstractControl;  };

我在Visual Studio Code(Windows)和Angular Language Services中有此消息,但没有ng lint

迄今为止最好的解决方案:

尝试添加“ !!”。
虽然很棘手,
我这样成功了。

image

_from: https :

感谢tmrony,这是经过数天搜索的最佳解决方案...

实际上应该是这样,因为“ AbstractControl”的“ errors”属性没有严格定义的属性,而是“ ValidationErrors ”类型,因此显示了错误高亮显示

因此,直接访问验证规则会导致错误,在我的情况下,使用方括号表示法可以解决此问题。

(顺便说一句,即使我直接访问验证属性,但没有收到编译错误,该应用程序仍然可以正常运行)

image

另一种方法是使用控件的“ hasError”方法:

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

@ boban984解决方案成功了...

@adickenscheidt解决方案为我工作! 谢谢

“ price.errors ['required']”->正常工作
“ !! price.errors.required”->起作用

“ price?.errors..required”也应该起作用,因为我的“ fullname?.errors..required”有效

“ price.errors ['required']”->正常工作

这不会触发编译器“未定义标识符”,但这不是一个好的解决方案,因为如果errors对象为null,它将在控制台上引起错误。

@ boban984
这是获胜者的解决方案和解释。

我很高兴找到这里讨论的hasError()方法,它肯定是显示条件模板意图的最清晰方法,我想我会尽力使用它。

但是...没人在解决问题的根本原因,而语言服务已经是大约一年以前的问题了。 errors属性具有键索引签名( [key: string]: any ),这意味着在TS代码中,无论您设置了什么严格模式标志,语句myControl.errors.anythingYouLike都可以干净地编译。 。 这是正确的,因为具有这样的索引签名的全部目的是能够在运行时创建任意属性,并通过点符号或索引符号访问它们。 语言服务允许使用索引符号,这就是为什么control?.errors['required']起作用的原因,但是将点符号标记为不正确,这是一个错误。

三种解决方案:

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

我喜欢第三好的

@ boban984很棒的解决方案和解释

thnks,为我工作! 👍🏼
我讨厌在控制台上查看错误😬

您好尝试这样。
Form.hasError('required');

这是最优雅的解决方案,并且确实适用于所有情况:myForm.hasError('required','myField')。

谢谢@antonheck

您好尝试这样。
Form.hasError('required');

这是最优雅的解决方案,并且确实适用于所有情况:myForm.hasError('required','myField')。

它可以工作,但是@ boban984提供了基于简单性的最佳解决方案:“ myField.hasError('required')”。 :)

我以这种方式解决了这个问题:

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

希望对您有所帮助。

完美@bePericon这对我
谢谢!

<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>
这在Angular 7中对我有用

那么两年后还没有解决? 🤣
相关: https :

那么两年后还没有解决? 🤣
相关:#110

这不是错误,而是它应该工作的方式

如果这是预期的功能,可以更新文档吗? (参见此处的一个示例)。

显然,这可以推断可以使用ngModel的原始属性访问器,而该线程已确定它们绝对不能使用。

其实是固定的吗? 很久以前我切换到hasError,但是现在我正在尝试并且无法重现该错误。 myControl.errors.maxlength不会为我产生任何红色波浪状。 这与语言服务扩展0.801.1配合使用,该扩展使用库的v8.1.x(如果有帮助)。

@ thw0rted因此,在用myControl.errors.required.pattern重新测试后,(意识到我错过了input标签上的required属性,这导致了更大的失败),他们没有很好的工作。

Required多数有效,但是会弹出一些奇怪的错误(缺少捕获错误,不幸的是它们不一致),并且pattern在模式错误但似乎未更新时触发当模式正确时。

另外,我有相同的vsCode语言扩展,但仍然奇怪地看到弯曲。

目前要坚持使用.hasError解决方案,并且可能仍会建议对文档进行更新,至少是将其作为更清晰/最佳实践使用。

我发现,每当您引用定义为“ any”的属性时,都会出现此错误。 另一个解决方法是使用括号属性注释clientFirstName?.errors ['required'],它也很愚蠢。

这为我消除了错误。 作为参考,即使在概述了错误的情况下,该代码仍然有效,我只是不喜欢在代码中看到红线。

是的,将密钥作为字符串放入会删除红线。

但是您将失去诸如正确拼写和自动完成功能之类的功能。

除了使用hasError()之外,访问窗体的子控件还应该使用get()而不是点访问。 例如

class MyComponent {
  form: FormGroup;
}

在模板中带有这样的行:

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

错误信息 :

未定义标识符“电子邮件”。 '__type'不包含此类成员

解决方案是:

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

同样的问题。

f.email.errors.email.required失败
!! f.email.errors.email.required失败
f.email?.errors.email.required失败
f?.email?.errors.email.required失败
f.email.error。['必需']失败
f.email?.error。['必需']失败

这对我有用:

f ['email']。errors.required

由于不活动,此问题已自动锁定。
如果您遇到类似或相关的问题,请提出新的问题。

阅读有关我们的自动对话锁定策略的更多信息。

_此动作已由漫游器自动执行。_

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

fxck picture fxck  ·  6评论

mhamri picture mhamri  ·  4评论

kondi picture kondi  ·  4评论

Liero picture Liero  ·  3评论

daveriedstra picture daveriedstra  ·  3评论