File
Implements
Metadata
| changeDetection |
ChangeDetectionStrategy.OnPush |
| selector |
cx-product-variants-container |
| templateUrl |
./product-variants-container.component.html |
|
product$
|
Type : Observable<Product | null>
|
|
|
|
variants
|
Type : literal type
|
Default value : {}
|
|
|
|
variantType
|
Default value : VariantType
|
|
|
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import {
BaseOption,
isNotNullable,
Product,
RequiredPick,
VariantType,
} from '@spartacus/core';
import { CurrentProductService } from '@spartacus/storefront';
import { Observable } from 'rxjs';
import { distinctUntilChanged, filter, tap } from 'rxjs/operators';
@Component({
selector: 'cx-product-variants-container',
templateUrl: './product-variants-container.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ProductVariantsContainerComponent implements OnInit {
constructor(private currentProductService: CurrentProductService) {}
variants: { [key: string]: BaseOption } = {};
variantType = VariantType;
product$: Observable<Product | null>;
ngOnInit(): void {
this.product$ = this.currentProductService.getProduct().pipe(
filter(isNotNullable),
filter(
(product): product is RequiredPick<Product, 'baseOptions'> =>
!!product.baseOptions
),
distinctUntilChanged(),
tap((product) => {
product.baseOptions.forEach((option: BaseOption) => {
if (option?.variantType) {
this.variants[option.variantType] = option;
}
});
})
);
}
}
<ng-container *ngIf="product$ | async as product">
<div class="variant-section" *ngIf="product.baseOptions?.length">
<cx-product-variant-style-selector
*ngIf="variants[variantType.STYLE]"
[variants]="variants[variantType.STYLE]"
></cx-product-variant-style-selector>
<cx-product-variant-size-selector
*ngIf="variants[variantType.SIZE]"
[product]="product"
[variants]="variants[variantType.SIZE]"
></cx-product-variant-size-selector>
<cx-product-variant-color-selector
*ngIf="variants[variantType.COLOR]"
[product]="product"
[variants]="variants[variantType.COLOR]"
></cx-product-variant-color-selector>
</div>
</ng-container>
Legend
Html element with directive