javascript - Korrekt sätt att kalla på modaldialog från en annan komponent i Angular?


Jag har en komponent som kallas avdelning där jag skapar en avdelning med en modal dialog som visas nedan:

avdelning.komponent :

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

create() {
    //code omitted for simplicity
}

employee.component :

createDepartment() {
    //???
}

Å andra sidan har jag en annan komponent som kallas anställd och jag behöver skapa en avdelning genom att kalla på öppna dialogen och skapa metoder i avdelningskomponenten.

Vad är det rätta sättet att skapa en avdelning från anställdkomponenten? Bör jag implementera openModal() och create() metoder i anställdkomponenten också? Eller bör jag kalla på de metoder som redan är definierade i avdelningskomponenten? Jag tror att det vore bättre att använda redan existerande metoder och komponenter för att undvika upprepning.

Finns det något exempel på tillvägagångssätt för detta scenario?

Svar #1

<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>

export class CampaignConfigurableProductsComponent implementerar 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.log(error)
    })
}



}

Svar #2

Extrahera denna datalogik från komponenterna och flytta den till en separat tjänst.

// 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)
  }
}

REDIGERA:
Med lite mer information är ett specifikt formulär (för att skapa en avdelning) avsett att visas på mer än ett ställe i appen (i en modal och en anställd-komponent).

För detta, skapa en komponent som innehåller formuläret (med skapa-knapp etc.) och de nödvändiga händelsehanterarna (t.ex. skapa avdelningsknapp) och visa det där det behövs (den faktiska logiken för att skapa avdelningen bör finnas i en separat tjänst).

Till exempel i medarbetarens html

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

Och modalen bör vara något i stil med detta (komponenten kan behöva vara i EntryComponents, beroende på Angular-version):

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

(Dokumentation för MatDialog: https://material.angular.io/components/dialog/overview)