提问者:小点点

使用变异器和访问器时出现Laravel livewire问题


我尝试输入一个模型,其属性是以一定单位存储在数据库中的浮点数,例如体积:升。我希望用户能够查看并输入他们选择的单位值,例如美国加仑,而不是升,允许用户随时选择其他单位,例如美国加仑

我打算做的是根据用户选择的单位创建变异器和访问器,在保存之前将自定义单位转换为升,在获取时将升转换为自定义单位。这是我的模型摘录

    class Equipment extends Model
{
    use HasFactory;
    protected $table = "equipments";
    protected $fillable = [
        'name',
        ...
        'boiler_volume',
        'boiler_dead_volume',
        ...
    ];

    protected $appends = ['boiler_volume','boiler_dead_volume'];

    //get the user's unit transformation factor (it works and return a float number)
    private function getKVolume()
    {
        $units = Unitset::where('user_id', auth()->user()->id)->first();
        return explode(',', $units->volume)[2];
    }

    //BOILER-----------------
    public function setBoilerVolumeAttribute($value)
    {
        if (is_numeric($value) and $value !== null and $value != 0) {
            $this->attributes['boiler_volume'] = $value * $this->getKVolume();
        }
    }
    public function getBoilerVolumeAttribute($value)
    {
        if (is_numeric($value)) {
            return $value / $this->getKVolume();
        }
    }
    //------------------
    public function setBoilerDeadVolumeAttribute($value)
    {
        if (is_numeric($value) and $value !== null and $value != 0) {
            $this->attributes['boiler_dead_volume'] = $value * $this->getKVolume();
        }
    }

    public function getBoilerDeadVolumeAttribute($value)
    {
        if (is_numeric($value)) {
            return $value / $this->getKVolume();
        }
    }

现在是livewire组件中的规则

protected $rules =[
    ...
    'equipment.boiler_volume'=>'required|numeric',
    'equipment.boiler_dead_volume'=>'required|numeric',
    ...
];

最后是叶片视图中的相关部分

<x-input.group label="{{ __('Boiler Tun Volume ') }} ({{ explode(',', $unitset->volume)[0] }})" for='
            boiler_volume' :error="$errors->first('equipment.boiler_volume')"
        class="flex flex-col w-full p-2 border border-jbrown-peachpuf bg-jbrown-darker rounded-md ">
        <x-input.text wire:model.lazy="equipment.boiler_volume" type="number" step="0.001"
            class="border border-red-200 bg-red-100" name="boiler_volume" id="boiler_volume" value="" />
    </x-input.group>
    <x-input.group label="{{ __('Boiler Tun Dead Volume ') }} ({{ explode(',', $unitset->volume)[0] }})" for='
            boiler_dead_volume' :error="$errors->first('equipment.boilen_dead_volume')"
        class="flex flex-col w-full p-2 border border-jbrown-peachpuf bg-jbrown-darker rounded-md ">
        <x-input.text wire:model="equipment.boiler_dead_volume" type="text" class="border border-red-200 bg-red-100"
            name="boiler_dead_volume" id="boiler_dead_volume" value="" />
    </x-input.group>

正如您所看到的,第一个输入使用数字类型,而第二个输入使用文本类型。这仅用于解释,因为故障与数字输入类型或文本输入类型相同。但现在让我说问题是什么。

有什么问题吗?问题是,第二个现场设备。锅炉死区体积一旦输入一个值,就不能删除它(例如,为了校正)。您可以删除输入的所有数字,但第一个数字除外。但是,如果使用左箭头键将光标放在字段的开头,则可以输入新值,然后删除最后一个字符,但决不能让字段为空。这对用户来说相当烦人。

我必须补充一点,如果不使用变异器和访问器,这种行为就不存在。此外,锅炉体积的第一个字段即使使用存取器和变异器也能正常工作。最后和最后,所有其他字段的行为相同,即错误。

注意这一行

 protected $appends=...

不会改变任何事情。

其他奇怪的行为查看突变器和访问器,您可以看到一些检查值是否为数字而不是null。这是因为如果没有这个检查,每次一个字段被清空,应用程序都会抱怨这个值不是数字。

我会很高兴得到一些帮助解决这个问题!


共1个答案

匿名用户

看来电线:model.lazy是强制性的。在第一组中,我在另一个时间使用了它,却没有意识到。所以,在这种情况下,懒惰是强制性的。