У меня есть компонент под названием отдел, где я создаю отдел, используя модальное диалоговое окно, как показано ниже:
отдел.компонент
openModal(data) {
//code omitted for simplicity
this.modalService.showMOdal();
this.create();
}
create() {
//code omitted for simplicity
}
сотрудник.компонент
createDepartment() {
//???
}
С другой стороны, у меня есть другой компонент, называемый сотрудником, и мне нужно создать отдел, вызвав диалог открытия и создав методы в компоненте отдела.
Как правильно создать отдел из компонента сотрудника? Должен ли я реализовать методы openModal()
и create()
в компоненте сотрудника? Или я должен вызывать методы, которые уже определены в компоненте отдела? Я думаю, что лучше использовать уже существующие методы и компоненты, чтобы избежать повторения.
Любой пример подхода для этого сценария?
У меня есть сервис в примере modalService
. Но как насчет других вещей? Должен ли я снова создавать поля формы отдела в компоненте сотрудника?
А если привести пример кода?
Я имею в виду, что вы можете обернуть modalService и создать метод для другой службы, что-то в этом роде, а затем внедрить эту службу в оба компонента.
Спасибо, но я не мог себе этого представить. Любой пример кода с пустыми методами?
@KevinZhang А как насчет твоего ответа? Вы удалили его?
Извлеките эту логику данных из компонентов и переместите ее в отдельный сервис.
// 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. Если это так, лучше определить поля формы отдела в сотруднике и напрямую открыть его, используя метод, который используется для открытия формы сотрудника?
Я не совсем уверен, что понимаю, что вы имеете в виду. Поле формы будет результатом модального (модальные могут возвращать данные)? Если да, то я не вижу смысла передавать данные от сотрудника отделу. Возможно, вы захотите вернуть некоторую информацию о новом отделе компоненту сотрудника для подключения к нему сотрудника.
Взгляните на это (использует бутстрап, который я не знаю, используете ли вы его, но общая логика такая же) itnext.io/… Возможно, вы хотите сопоставить значение поля формы с объектом (интерфейсом) и вернуть это.
Мне нужно дать некоторую дополнительную информацию относительно моей ситуации. Я создаю форму создания отдела в модальном компоненте отдела. Мне также нужно создать отдел при открытии формы создания сотрудника (я добавляю эту форму и дополнительную кнопку для создания отдела). При нажатии этой кнопки добавления я хочу создать отдел. На этом этапе я не уверен, что является лучшим вариантом среди следующих ситуаций.
1. Снова построить форму создания отдела, как я сделал в компоненте отдела, и определить необходимые методы создания сотрудников в компоненте сотрудника?
2. Или вызвать компонент создания отдела и использовать его методы, которые уже определены в компоненте отдела? Нет необходимости передавать данные, просто подумайте о том, чтобы снова использовать тот же компонент вместо повторного создания. Но даже если это так, я думаю, что мне нужно создать поля формы отдела в компоненте сотрудника. Это правда?
Итак, фактический вопрос касается повторного использования компонента. Я немного добавил к своему ответу. По сути, вы хотите создать обычный компонент, который содержит форму, и использовать ее там, где это необходимо (диалоги можно открывать с определенным компонентом, который должен отображаться).
<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>
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
- это просто компонент формы и не содержит ничего лишнего, например. список,... ?
AddConfigurableProductComponent да, это компонент, и он используется для хранения данных о продукте при заполнении с использованием диалоговой формы. @Фредрик
Создайте службу для выполнения этих задач и внедрите ее в свой компонент.