Правильный способ вызова модального диалога из другого компонента в Angular?

У меня есть компонент под названием отдел, где я создаю отдел, используя модальное диалоговое окно, как показано ниже:

отдел.компонент

openModal(data) {
    //code omitted for simplicity
    this.modalService.showMOdal();
    this.create();
}

create() {
    //code omitted for simplicity
}

сотрудник.компонент

createDepartment() {
    //???
}

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

Как правильно создать отдел из компонента сотрудника? Должен ли я реализовать методы openModal() и create() в компоненте сотрудника? Или я должен вызывать методы, которые уже определены в компоненте отдела? Я думаю, что лучше использовать уже существующие методы и компоненты, чтобы избежать повторения.

Любой пример подхода для этого сценария?

Создайте службу для выполнения этих задач и внедрите ее в свой компонент.

Kevin Zhang 24.12.2020 09:48

У меня есть сервис в примере modalService. Но как насчет других вещей? Должен ли я снова создавать поля формы отдела в компоненте сотрудника?

Jack 24.12.2020 09:51

А если привести пример кода?

Jack 24.12.2020 09:51

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

Kevin Zhang 24.12.2020 10:00

Спасибо, но я не мог себе этого представить. Любой пример кода с пустыми методами?

Jack 24.12.2020 10:02

@KevinZhang А как насчет твоего ответа? Вы удалили его?

Jack 24.12.2020 11:08
Поведение ключевого слова "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
6
6 694
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Извлеките эту логику данных из компонентов и переместите ее в отдельный сервис.

// Move functions for opening the modal from DepartmentComponent to a service
@Injectable({providedIn: 'root'})
export class DepartmentService {
  constructor(private modalService: ModalService){}

  openModal(data) {...}

  create() {...}
}

// Inject the service into EmployeeComponent
export class EmployeeComponent {
  constructur(private departmentService: DepartmentService){}

  createDepartment() {
    this.departmentService.openModal()/create();  // whichever you actually need to call (should probably only be one that delegates to other functions)
  }
}

Обновлено:
С дополнительной информацией конкретная форма (для создания отдела) предназначена для отображения более чем в одном месте в приложении (в модальном компоненте и компоненте сотрудника).

Для этого создайте компонент, который содержит форму (с кнопкой создания и т. д.) и необходимые обработчики событий (например, кнопку создания отдела) и отобразите их там, где это необходимо (фактическая логика создания отдела должна быть в отдельном сервисе).

Например. в html сотрудника

... employee information ...
<app-createdepartment></app-createdepartment>

И модальное окно должно быть примерно таким (компонент может быть в EntryComponents, в зависимости от угловой версии):

let dialogRef = dialog.open(CreateDepartmentComponent, {
  height: '400px',
  width: '600px',
});

(Документы для MatDialog: https://material.angular.io/components/dialog/overview)

Спасибо за ответ. В этом подходе мне все еще нужно передать поля формы службе, и в результате я думаю, что мне нужно определить поля формы модального отдела в компоненте emeployee. Если это так, лучше определить поля формы отдела в сотруднике и напрямую открыть его, используя метод, который используется для открытия формы сотрудника?

Jack 24.12.2020 11:26

Я не совсем уверен, что понимаю, что вы имеете в виду. Поле формы будет результатом модального (модальные могут возвращать данные)? Если да, то я не вижу смысла передавать данные от сотрудника отделу. Возможно, вы захотите вернуть некоторую информацию о новом отделе компоненту сотрудника для подключения к нему сотрудника.

Gunnar B. 24.12.2020 11:33

Взгляните на это (использует бутстрап, который я не знаю, используете ли вы его, но общая логика такая же) itnext.io/… Возможно, вы хотите сопоставить значение поля формы с объектом (интерфейсом) и вернуть это.

Gunnar B. 24.12.2020 11:37

Мне нужно дать некоторую дополнительную информацию относительно моей ситуации. Я создаю форму создания отдела в модальном компоненте отдела. Мне также нужно создать отдел при открытии формы создания сотрудника (я добавляю эту форму и дополнительную кнопку для создания отдела). При нажатии этой кнопки добавления я хочу создать отдел. На этом этапе я не уверен, что является лучшим вариантом среди следующих ситуаций.

Jack 24.12.2020 11:45

1. Снова построить форму создания отдела, как я сделал в компоненте отдела, и определить необходимые методы создания сотрудников в компоненте сотрудника?

Jack 24.12.2020 11:46

2. Или вызвать компонент создания отдела и использовать его методы, которые уже определены в компоненте отдела? Нет необходимости передавать данные, просто подумайте о том, чтобы снова использовать тот же компонент вместо повторного создания. Но даже если это так, я думаю, что мне нужно создать поля формы отдела в компоненте сотрудника. Это правда?

Jack 24.12.2020 11:46

Итак, фактический вопрос касается повторного использования компонента. Я немного добавил к своему ответу. По сути, вы хотите создать обычный компонент, который содержит форму, и использовать ее там, где это необходимо (диалоги можно открывать с определенным компонентом, который должен отображаться).

Gunnar B. 24.12.2020 12:00
Ответ принят как подходящий
<button type = "button" (click) = "addCampaignProduct()" mat-raised-button color = "primary"
[title] = "'ADD_CAMPAIGN_PRODUCT' | translate:lang">
<i class = "material-icons">add_circle</i>{{ 'ADD_CAMPAIGN_PRODUCT' | translate:lang }}
</button>

класс экспорта CampaignConfigurableProductsComponent реализует OnInit, AfterViewInit { }


    addCampaignProduct() {
        const dialogRef = this.dialog.open(AddConfigurableProductComponent, {
            disableClose: true,
            data: { campaignId: this.params.id }
        })
        dialogRef.afterClosed().subscribe(() => {
          this.ngOnInit()
        });
    }

export class AddConfigurableProductComponent implements OnInit { 


 addProduct() {
    const selectedOrderIds = this.addProductForm.value.colors
      .map((checked, i) => checked ? this.colorAttributeData[i].config_product_option_value : null)
      .filter(v => v !== null);

    if (this.addProductForm.value.actual_price == '') {
      this.sales_price = this.addProductObj.recommended_price;
    } else {
      this.sales_price = this.addProductForm.value.actual_price;
    }
    this.addProductObj['sales_price'] = this.sales_price;
    this.addProductObj['actual_price'] = this.finalPriceValue;
    this.addProductObj['campaign_id'] = this.data.campaignId;

this.campaignService.addProductCatalog(this.addProductObj).subscribe((response: any) => {
      if (response) { 

      }
  }, (error) => {
      this.notify.error('Something went wrong')
      console.info(error)
    })
}



}

Я думаю, что AddConfigurableProductComponent - это просто компонент формы и не содержит ничего лишнего, например. список,... ?

Jack 24.12.2020 15:10

AddConfigurableProductComponent да, это компонент, и он используется для хранения данных о продукте при заполнении с использованием диалоговой формы. @Фредрик

Darshan Malani 25.12.2020 06:48

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