You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 18中computed报this.doorAmount不是函数错误排查

问题解决:TypeError: this.doorAmount is not a function

错误原因

在创建computed信号时,直接传递类的私有方法作为回调(比如computed(this.calculatePricePerDoor)),导致方法内部的this丢失了对CalculationService实例的指向。当Angular执行computed的计算逻辑时,this不再指向当前服务实例,此时this.doorAmount无法被正确识别为computed信号的调用函数,从而抛出错误。

解决方案

将computed的回调改为箭头函数包裹方法调用,确保this始终指向服务实例。修改所有computed信号的定义:

// 替换原来的computed定义
doorAmount = computed(() => this.countDoorAmount());
price = computed(() => this.#price());
pricePerDoor = computed(() => this.calculatePricePerDoor());
priceStep = computed(() => this.calculatePriceStep());
hours = computed(() => this.countHours());
days = computed(() => this.countDays());

注意:原代码中price = computed(this.#price);的写法错误,#price是signal对象,必须通过调用this.#price()获取其值,箭头函数包裹调用才能保证逻辑正确。

额外优化提示

原代码中calculatePrice方法需要手动调用才能更新价格,无法自动响应依赖信号的变化。可以将#price替换为computed信号,实现自动更新:

// 移除原有的#price信号和calculatePrice方法,替换为以下computed定义
price = computed(() => {
  return basePrice +
    this.pricePerDoor() +
    basePricePerDay * this.days() +
    this.priceStep();
});

// 同时删除构造函数中的this.calculatePrice();调用

这样当门的数量参数变化时,价格会自动重新计算,无需手动触发更新。

内容的提问来源于stack exchange,提问作者Benjamin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:42:01