Модальный всплывающий компонент Bootstrap не работает при щелчке элемента угловой формы

У меня есть требование, в котором я использую множественный выбор угловой формы, которая также имеет логотип для каждой строки. При нажатии на этот логотип я хочу загрузить компонент модального всплывающего окна, я следую демонстрации Stackblitz для вызова модального компонента в app.component при нажатии элемента.

Ссылка на демонстрацию, по которой я перешел: Bootstrap modal Stackblitz Demo

Моя демонстрация обходного пути, которую я реализую, выглядит следующим образом: Демонстрация обходного пути Stackblitz

Ошибка, которую я получаю при нажатии логотипа с помощью функции openModal(), имеет неопределенное значение.

Как исправить это при работе с угловой формой?

Ниже приведен фрагмент кода:

компонент multiselect form

@Component({
selector: 'formly-field-multiselect',
template: `<br><p-multiSelect  [options] = "to.options"
  [formControl] = "formControl"
  [formlyAttributes] = "field"
  [showClear] = "!to.required" >
  <ng-template let-item pTemplate = "item">
  <div>{{item.label}}</div>
   <div>
   <i class = "pi pi-check" (click) = "to.openModal()"></i>
   </div>
  </ng-template>
</p-multiSelect>
`,
})

app.component.ts, в котором вызывается модальный компонент (calenderComponent)

fields: FormlyFieldConfig[] = [
{
  key: "select",
  type: "multiselect",
  templateOptions: {
    multiple: false,
    placeholder: "Select Option",
    options: [
      { label: "Select City", value: null },
      { label: "New York", value: { id: 1, name: "New York", code: "NY" } },
      { label: "Rome", value: { id: 2, name: "Rome", code: "RM" } },
      { label: "London", value: { id: 3, name: "London", code: "LDN" } },
      {
        label: "Istanbul",
        value: { id: 4, name: "Istanbul", code: "IST" }
      },
      { label: "Paris", value: { id: 5, name: "Paris", code: "PRS" } }
    ],
      openModal() {
         this.modalRef = this.modalService.show(CalenderComponent,  {
         initialState: {
         title: 'Modal title'
       }
  });
 }, 
 }
}

как вы получаете ошибку, которую вы упомянули в своем stackblitz?

Moshezauros 23.12.2020 06:02

Я нажимаю на значок строки с множественным выбором, которая находится в <i class = "pi pi-check" (click) = "to.openModal()"></i>, а затем получаю сообщение об ошибке,

Shashank S Chandel 23.12.2020 06:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
381
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы отлаживаете это, вы можете увидеть, что this в контексте вашей функции (openModal) — это field, который вы определили в объекте fields, который не имеет службы modalService, которую вы внедрили в компонент, чтобы преодолеть это, вы можете использовать лямбда-выражение:

  openModal: () => {
    this.modalRef = this.modalService.show(CalenderComponent, {
      initialState: {
        title: "Modal title"
      }
    });
  }

это сохраняет замыкание, как вы хотели, вы можете прочитать больше об этом здесь

После того, как вы решите эту проблему, вы столкнетесь с другой:

Чтобы преодолеть это, вам нужно добавить CalenderComponent в качестве компонента входа в файл вашего модуля приложения (app.module.ts):

entryComponents: [CalenderComponent]

Вот разветвленный рабочий stackblitz

Описано наилучшим образом, спасибо за поддержку и предоставленное решение, я понял концепцию использования замыкания и использования entryComponents. Пожалуйста, проголосуйте за вопрос для лучшего охвата. Ваше здоровье!

Shashank S Chandel 23.12.2020 06:57

Мошезаурос, не могли бы вы помочь мне в одном из требований: последний комментарий к ответу: stackoverflow.com/questions/65284562/…

Shashank S Chandel 28.12.2020 14:31

Другие вопросы по теме