Как вы используете реактивные формы в пользовательском элементе Angular Elements?

Я пытаюсь создать компонент Angular Elements для встраивания на размещенную веб-страницу, и я хочу, чтобы мой компонент содержал реактивную форму Angular.

Сбой сборки с ошибкой: «Невозможно выполнить привязку к 'formGroup', поскольку это неизвестное свойство 'form'».

Кто-нибудь может определить, что я делаю не так?

Изменить: это Angular 9 и TypeScript 3.7, работающие на последней версии Angular CLI. Stackblitz: https://stackblitz.com/edit/angular-57wq1s

Изменить 2: обновленный код Stackblitz больше не вызывает ошибку времени компиляции, но элемент управления не завершает рендеринг. Кнопка «Отправить» не отображается. Если я удалю директиву formControlName из ввода пароля, компонент выполнит рендеринг полностью.

Изменить 3: StackBlitz, похоже, сейчас работает, но если я загружу на свой компьютер, npm install и ng serve, у меня возникнет проблема, когда он отобразит текстовое поле, но не кнопку.

Index.html

<!doctype html>
<html lang="en">
<body>
  <app-password-reset></app-password-reset>
</body>
</html>

app.module.ts

@NgModule({
  declarations: [],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule
  ],
  entryComponents: [PasswordResetComponent],
  providers: [],
})
export class AppModule {
  constructor(injector: Injector) {
    const passwordResetElement = createCustomElement(PasswordResetComponent, {injector});
    customElements.define('app-password-reset', passwordResetElement);
  }

  ngDoBootstrap(): void { }
}

password-reset.component.ts

@Component({
  template: `
    <form [formGroup]="resetForm" (ngSubmit)="formSubmit($event)">
      <input type="password" formControlName="password">
      <button type="submit">Reset Password</button>
    </form>`
})
export class PasswordResetComponent {

  constructor(private fb: FormBuilder) { }

  resetForm = this.fb.group({
    password: [null, Validators.required],
  });

  formSubmit(event: Event) {
    alert('it works');
  }

}

person Chad    schedule 19.02.2020    source источник
comment
Я думаю, вам также нужно импортировать FormsModule   -  person Barkha    schedule 19.02.2020
comment
Хорошо, я добавил это в свой app.module.ts, но все еще получаю ту же ошибку. Я обновлю свой исходный образец кода.   -  person Chad    schedule 19.02.2020
comment
можете ли вы создать этот проект на stackblitz.com?   -  person Sats    schedule 19.02.2020
comment
Я добавил его в Stackblitz, но не уверен, что он совместим с Angular Elements. У меня другая ошибка ... stackblitz.com/edit/angular-fsyral   -  person Chad    schedule 19.02.2020
comment
@SatishPai - забыл отметить вас   -  person Chad    schedule 19.02.2020
comment
@Chad теперь текущая ошибка, которую мы получаем, отличается от того, что было упомянуто в вопросе. Вы хотите создать компонент динамически?   -  person Sats    schedule 20.02.2020
comment
@SatishPai - Хорошо, моя ошибка. Я обновил пакет и исправил вторичную проблему. Если вы вернетесь к StackBlitz, вы должны увидеть, что он загружает элемент управления лишь частично. Кнопка sumbit отсутствует. Это не исходная ошибка, но симптом той же проблемы.   -  person Chad    schedule 20.02.2020
comment
@Chad, я получаю эту ошибку TypeError: Failed to construct 'HTMLElement': Please use the 'new' operator, this DOM object constructor cannot be called as a function из вашего общего stackblitz. Вы сохранили изменения после изменений в файле пакета?   -  person Sats    schedule 20.02.2020
comment
@SatishPai - Исправление заключалось в том, чтобы закрепить версию элемента-регистра-документа до версии 1.8.1. Я только что сохранил. Должен работать сейчас. Похоже, что теперь весь компонент у меня работает в StackBlitz, но если я загружаю на свой локальный компьютер, запускаю npm install и ng serve, у меня возникает проблема, когда текстовое поле отображается, а кнопка - нет.   -  person Chad    schedule 20.02.2020
comment
@Chad проверяет, что ошибки нет.   -  person Sats    schedule 20.02.2020
comment
@Chad, какую версию Chrome вы используете?   -  person Sats    schedule 20.02.2020
comment
@SatishPai - 79.0.3945.130   -  person Chad    schedule 20.02.2020
comment
@SatishPai - Очень странно. Я получаю странные варианты этой проблемы в зависимости от проекта и среды. В моем реальном приложении, где я пытаюсь решить проблему, пользовательский элемент вообще не отображается, как вы видите. Иногда, когда я запускаю пример в StackBlitz, он работает, особенно когда я создаю новый проект. Иногда это не так. Когда я загружаю проект из StackBlitz и запускаю его локально, я вижу текстовое поле внутри визуализации компонента, но не кнопку sumbit. В других случаях я получаю сообщение об ошибке в исходном сообщении.   -  person Chad    schedule 20.02.2020
comment
@Chad согласен, что теперь я могу воспроизвести ту же проблему. TextBox отображается, но не кнопка, необходимо это проверить   -  person Sats    schedule 20.02.2020
comment
@SatishPai - Похоже, это проблема Айви. Вот StackBlitz, использующий Angular CLI v.9 с Ivy: stackblitz.com/edit/angular-57wq1s и вот один на CLI 8 без Ivy: stackblitz.com/edit/angular-cqvkzw Не-Айви мне подходит, а Айви - нет. Вы видите то же самое?   -  person Chad    schedule 20.02.2020
comment
@ Чад, я согласен с тобой. Я пытаюсь сделать так, чтобы плющ работал с настраиваемым элементом   -  person Sats    schedule 21.02.2020


Ответы (1)


Сначала импортируйте FormsModule в свой app.module.ts

Вы можете использовать FormBuilder для создания вашей формы и установить пароль с помощью Validators. Он прост в использовании и облегчает работу.

Вот как я это делаю.

HTML-страница

<form [formGroup]='addEventForm' (ngSubmit)='addEvent(addEventForm.value)'>
</form>

Component.ts

import { FormGroup, FormBuilder, Validators } from '@angular/forms';

addEventForm: FormGroup;
  constructor(formBuilder: FormBuilder) {
this.addEventForm = formBuilder.group({
  title: [null, Validators.required],
  location: [null, Validators.required],
  description: [null, Validators.required],
  startDateValue: [null, Validators.required],
  endDateValue: [null, Validators.required],
  startTime: [null, Validators.required],
  endTime: [null, Validators.required],
  eventType: ['payed'],
  price: ''
});
}

Обратите внимание, что вам необходимо импортировать FormBuilder.

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

person Mohamad Mousheimish    schedule 19.02.2020
comment
Спасибо за помощь. Я изменил код, чтобы импортировать FormsModule и использовать FormBuilder, но все равно получаю ту же ошибку. - person Chad; 19.02.2020
comment
не могли бы вы обновить свой вопрос с помощью нового кода - person Mohamad Mousheimish; 19.02.2020
comment
Вместо password: [null] сделайте это password: [null, Validators.required] и также импортируйте Validators из @angular/forms. - person Mohamad Mousheimish; 20.02.2020
comment
Хорошо, теперь он строит без жалоб, но не отображает компонент. Теперь, если я проверю HTML во время работы приложения, там будет всего лишь ‹! - контейнер -› там, где должен быть компонент. - person Chad; 20.02.2020
comment
Итак, текстовое поле пароля загружается, а в журнале консоли нет ошибок. Чего ты ждешь? Предупреждение? - person Mohamad Mousheimish; 21.02.2020
comment
Кнопка должна загружаться, и при нажатии она должна предупреждать. - person Chad; 21.02.2020