Vscode-ng-language-service: Поддержка необязательного связывания в шаблоне

Созданный на 18 авг. 2017  ·  70Комментарии  ·  Источник: angular/vscode-ng-language-service

в 0.1.4 в Windows 10

errors?.required выделено как ошибка

Имя обязательно

image

Самый полезный комментарий

это сработало для меня:

Надеюсь, это вам поможет.

Все 70 Комментарий

Также происходит в OS X 10.11.6 (El Capitan).

ОС: OS X 10.11.6
Версия расширения: 0.1.4
Версия VS Code: 1.15.1

У меня тоже возникла эта проблема на Window 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 или в свой компонент, в котором существует форма?

Импорт @ angular / forms, упомянутый @VladBozhinovski , не решит эту проблему.
Вид связанных: https://github.com/angular/vscode-ng-language-service/issues/179

Да и у меня не получилось ...

у меня такая же проблема .... любое решение?

Та же проблема, кто-нибудь нашел исправление?

Здесь та же проблема. Есть идеи?

У меня тоже эта проблема есть какие-то решения

Тоже самое.

вроде я не одинок :)

Так много людей столкнулись с этой проблемой. Ребята, вы можете предотвратить это, например, "электронная почта? .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)

Убедитесь, что вы импортируете
импортировать {FormsModule, Validators} из '@ angular / forms';

Ни одно из решений в этом потоке не решает проблему. Я сделал пример максимально простым, чтобы убедиться, что все остальное не испортило его:

screen shot 2018-01-08 at 22 56 53

FormModule и Validators были импортированы из @ angular / forms. Я также протестировал это решение с помощью @ Duanthse03268 , и оно не только не

Моя реализация работает без ошибок в браузере, но сохраняет (предположительно неправильную) красную строку в редакторе (VSCode). Списки рассматриваемых файлов (все остальное вы можете просто воспроизвести ng new ...):

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

Версии:

Расширение: 0.1.7
VSCode: 1.19.1
Угловой интерфейс командной строки: 1.6.3
Узел: 9.2.1
ОС: macOS 10.12.6
Угловой: 5.1.3
Хром: 63.0.3239.84

Почему вы не пытались использовать myfield? .Error.required.

Я пробовал это, так же, как я писал в своем предыдущем комментарии: «Это не только не решает проблему с красной линией, но и вызывает ошибку в консоли, когда состояние myField изменяется (TypeError: Cannot read property 'required' of null ) ".

Итак, чтобы уточнить, myField? .Errors.required не работает и приводит к отображению вышеуказанного сообщения об ошибке в консоли. '?' должен быть написан после «ошибок», чтобы этот код работал в браузере без сообщения об ошибке, но не решает исходную проблему неправильной красной строки в редакторе.

Это очень раздражает, так как красные линии все еще есть, но функциональность работает. Я согласен с joonashak, поскольку представленные решения не работают, и использование обоих форматов не решает проблему.

это сработало для меня:

Надеюсь, это вам поможет.

Только обходные пути :(

IntelliJ выдает у меня ту же ошибку. Но реализация работает даже с ошибками в браузере. Обходной путь @Ahnset сработал для меня. Хотите знать, что это за синтаксис и как он сейчас работает?

Я обнаружил, что эта ошибка появляется каждый раз, когда вы ссылаетесь на свойство, которое определено как «любое». Другой обходной путь - использование аннотации свойства скобки clientFirstName? .Errors ['required'], что тоже довольно глупо.

Становится хуже всего, с последним обновлением vscode мое файловое дерево стало больше похоже на рождественскую елку: christmas_tree:

@adickenscheidt, спасибо за обходной путь. Отлично работает, согласен пока тупо.

удалена языковая служба Angular ...

@ 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 Решение сработало для меня.

Использование этого сработало для меня:

Только имя элемента нуждается в? отметка. Это не так уж и некрасиво

У меня такая же проблема, но ни одно из предложенных решений не помогло:
"форма? .get ('имя'). errors.required"
"form? .get ('name'). errors. ['required']"
"форма? .get ('name'). errors? .required"

Привет, попробуй вот так.
Form.hasError ('обязательно');

Это сработало для меня. Спасибо @antonheck

Есть несколько обходных путей, каждый из которых лучше подходит для разных ситуаций, да. Но проблема не в этом. Мне не следовало писать свой код по-другому, включая уродливый, хакерский синтаксис, только чтобы успокоить расширение 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://github.com/angular/vscode-ng-language-service/issues/126#issuecomment -366200219_

Спасибо tmrony, лучшее решение после многих дней поиска ...

На самом деле это должно быть так, отображается выделение ошибки, потому что свойство «errors» объекта «AbstractControl» не имеет строго определенных свойств, это тип « 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']" -> Сработало

Это не запускает компилятор «идентификатор не определен», но это не лучшее решение, потому что, если объект ошибок имеет значение 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 Отличное решение и объяснение

спасибо, у меня работает !. 👍🏼
ненавижу просматривать ошибки на консоли 😬

Привет, попробуй вот так.
Form.hasError ('обязательно');

Это было наиболее элегантное решение, которое действительно работает во всех случаях: myForm.hasError ('required', 'myField').

Спасибо @antonheck

Привет, попробуй вот так.
Form.hasError ('обязательно');

Это было наиболее элегантное решение, которое действительно работает во всех случаях: 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://github.com/angular/vscode-ng-language-service/issues/110

Значит, через два года это так и не было исправлено? 🤣
связанные: # 110

Это не ошибка, это именно так и должно работать

Если это ожидаемая функциональность, можно ли обновить документацию? (см. здесь один пример).

Это явно означает, что можно использовать необработанные аксессоры свойств ngModel , а там, где этот поток установил, они определенно не могут.

На самом деле это исправлено? Я переключился на hasError много лет назад, но теперь я не могу воспроизвести ошибку. myControl.errors.maxlength у меня не вызывает красных волнистых линий. Это с расширением языковой службы 0.801.1, которое использует версию 8.1.x библиотеки, если это помогает.

@ thw0rted, поэтому при повторном тестировании с myControl.errors.required и .pattern и (понял, что я пропустил атрибут required во входном теге, что приводило к большему сбою), они не вполне работает.

Required основном работает, хотя были некоторые странные ошибки, которые выскакивали (пропустил их захват, и они, к сожалению, несовместимы), а pattern срабатывает, когда шаблон неправильный, но, похоже, не обновляется когда узор правильный.

Кроме того, у меня такое же расширение языка vsCode, и я все еще странно вижу волнистые линии.

Собираюсь придерживаться решения .hasError на данный момент и, вероятно, по-прежнему рекомендую обновлять документы, по крайней мере, для более четкого / передового использования.

Я обнаружил, что эта ошибка появляется каждый раз, когда вы ссылаетесь на свойство, которое определено как «любое». Другой обходной путь - использование аннотации свойства скобки 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. ['required'] Не работает
f.email?.error.[required '] Не работает

Это сработало для меня:

f ['электронная почта']. errors.required

Должно быть исправлено с помощью https://github.com/angular/angular/pull/33884.

Эта проблема была автоматически заблокирована из-за бездействия.
Сообщите о новой проблеме, если вы столкнулись с аналогичной или связанной проблемой.

Узнайте больше о нашей политике автоматической блокировки разговоров .

_Это действие было выполнено автоматически ботом. _

Была ли эта страница полезной?
0 / 5 - 0 рейтинги