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

Filament:删除Repeater项时如何获取subtotal值并更新外部maintotal字段

在Filament中删除Repeater项时更新外部总计字段

要实现删除InvoiceItems Repeater组件中的项时,自动从外部maintotal字段中减去被删除项的subtotal值,你可以通过自定义Repeater的deleteAction来实现,同时可补充状态监听让总计计算逻辑更完整:

完整代码示例

TextInput::make('maintotal')
    ->disabled() // 建议禁用总计字段,防止手动修改
    ->numeric(),
Repeater::make('InvoiceItems')
    ->schema([
        TextInput::make('subtotal')
            ->numeric()
            ->required(),
    ])
    ->deleteAction(function (Action $action, $record) {
        // 获取当前总计,默认值设为0
        $currentTotal = (float) ($this->form->getState()['maintotal'] ?? 0);
        // 计算新总计:减去被删除项的subtotal
        $newTotal = $currentTotal - (float) $record->subtotal;
        // 更新总计字段,确保数值不小于0
        $this->form->fill(['maintotal' => max($newTotal, 0)]);

        // 执行默认的删除操作
        return $action->record($record)->handle();
    })
    // 可选:监听Repeater状态变化(新增/编辑项时)自动重新计算总计
    ->afterStateUpdated(function () {
        $subtotals = collect($this->form->getState()['InvoiceItems'] ?? [])
            ->pluck('subtotal')
            ->map(fn ($val) => (float) $val)
            ->sum();
        
        $this->form->fill(['maintotal' => $subtotals]);
    })

关键说明

  • 自定义删除动作:通过deleteAction()传入闭包,可直接获取要删除的$record,从而拿到对应的subtotal值
  • 数值类型处理:用(float)强制转换确保计算时不会出现字符串拼接错误
  • 避免负数总计:用max($newTotal, 0)保证总计不会因删除操作变成负数
  • 完整状态监听:afterStateUpdated能覆盖新增、编辑Repeater项的场景,让总计始终和所有子项的subtotal总和保持一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:32:53