Angular 18 computed not a function

Discussão em 'Angular' iniciado por Benjamin, Abril 23, 2025.

  1. Benjamin

    Benjamin Guest

    I'm using Angular 18 with signals. My CalculationService basically calculates a price based on some parameters. Building with ng serve doesn't throw any errors neither does VSCode, however my browser throws the following:

    ERROR TypeError: this.doorAmount is not a function at Object.calculatePricePerDoor [as computation] (calculation.service.ts:52:48)


    And my component doesn't load.

    calculation.service.ts

    import { computed, Injectable, signal } from '@angular/core';
    import {
    basePrice,
    basePricePerDay,
    basePricePerDoor,
    minutesPerDoor,
    stepPrice,
    } from '../consts';

    @Injectable({
    providedIn: 'root',
    })
    export class CalculationService {
    #price = signal(0);
    #basicDoorAmount = signal(0);
    #electroDoorAmount = signal(0);
    #automaticDoorAmount = signal(0);

    doorAmount = computed(this.countDoorAmount);
    price = computed(this.#price);
    pricePerDoor = computed(this.calculatePricePerDoor);
    priceStep = computed(this.calculatePriceStep);
    hours = computed(this.countHours);
    days = computed(this.countDays);

    constructor() {
    this.calculatePrice();
    }

    calculatePrice() {
    this.#price.set(
    basePrice +
    this.pricePerDoor() +
    basePricePerDay * this.days() +
    this.priceStep()
    );
    }

    setBasic(amount: number) {
    this.#basicDoorAmount.set(amount);
    }

    setElectro(amount: number) {
    this.#electroDoorAmount.set(amount);
    }

    setAutomatic(amount: number) {
    this.#automaticDoorAmount.set(amount);
    }

    private calculatePricePerDoor() {
    const { basic, electro, automatic } = this.doorAmount();
    return (
    basic * basePricePerDoor.basic +
    electro * basePricePerDoor.electro +
    automatic * basePricePerDoor.automatic
    );
    }

    private calculatePriceStep() {
    const { basic } = this.doorAmount();
    if (basic < 21) return 0;
    if (basic < 101) return stepPrice[100];
    if (basic < 251) return stepPrice[250];
    if (basic < 1001) return stepPrice[1000];
    return stepPrice[1001];
    }

    private countDoorAmount() {
    return {
    basic: this.#basicDoorAmount(),
    electro: this.#electroDoorAmount(),
    automatic: this.#automaticDoorAmount(),
    };
    }

    private countHours() {
    const { basic, electro, automatic } = this.doorAmount();
    return (
    (basic * minutesPerDoor.basic +
    electro * minutesPerDoor.electro +
    automatic * minutesPerDoor.automatic) /
    60
    );
    }

    private countDays() {
    return Math.ceil(this.countHours() / 7.5);
    }
    }

    Continue reading...

Compartilhe esta Página