z-song / laravel-admin

Build a full-featured administrative interface in ten minutes
https://laravel-admin.org
MIT License
11.13k stars 2.81k forks source link

Radio 组件的表单联动问题 #5622

Open Johan-An opened 2 years ago

Johan-An commented 2 years ago

Description:

使用Radio组件表单联动的时候出现了一下问题: 期望:通过radio的组件切换,来实现radio组件中when 闭包中的select组件加载不同数据源(->ajax())的需求。 目前表现:无论怎么切换,第一个when闭包里面的ajax的URL总会被第二个when闭包里面的覆盖。这里比较特殊的一点是,两个when闭包里的select组件是同一个表单字段prizeCode,应该跟这个有很大的关系。

备注:第一个闭包中的->ajax('/admin/third-party/0/products') 获取的是优惠券。第二个闭包->ajax('/admin/third-party/1/products')获取的是真实商品。

Steps To Reproduce:代码如下:

$form->radio('type', __('类型'))->options( 
            [0 => '优惠券', 1 => '产品']
        )->when(0, function (Form $form) {
            $form->select('prizeCode', __('优惠券ID'))
                ->options(function ($id) {
                    $coupon = D1mProduct::findOrFail($id ?? '');
                    if ($coupon) {
                        return [$coupon->couponId => $coupon->couponName];
                    }
                })->ajax('/admin/third-party/0/products');
        })->when(1, function (Form $form) {
            $form->select('prizeCode', __('产品sku'))
                ->options(function ($id) {
                    $product = D1mProduct::findOrFail($id ?? '');
                    if ($product) {
                        return [$product->sku => $product->name];
                    }
                })->ajax('/admin/third-party/1/products');
        })->default(0);

希望大家给点建议。谢谢!

lio990527 commented 2 years ago

因为radio的联动切换只是切换多个层的显示和隐藏。你层内的select使用了相同的id,而select是通过className(未设置的话默认值和id相等)来绑定ajax的地址的,所以会被覆盖。 解决方式就是如果设置了elementName,则优先使用elementName。这样就可以避免相同的id导致地址被覆盖。

$form->select('column', 'label')->setElementName('s1');
$form->select('column', 'label')->setElementName('s2');
Johan-An commented 2 years ago

因为radio的联动切换只是切换多个层的显示和隐藏。你层内的select使用了相同的id,而select是通过className(未设置的话默认值和id相等)来绑定ajax的地址的,所以会被覆盖。 解决方式就是如果设置了elementName,则优先使用elementName。这样就可以避免相同的id导致地址被覆盖。

$form->select('column', 'label')->setElementName('s1');
$form->select('column', 'label')->setElementName('s2');

非常感谢!!!解决了,好像->setElementName('s1') 要放在->ajax()之前。

lio990527 commented 2 years ago

因为radio的联动切换只是切换多个层的显示和隐藏。你层内的select使用了相同的id,而select是通过className(未设置的话默认值和id相等)来绑定ajax的地址的,所以会被覆盖。 解决方式就是如果设置了elementName,则优先使用elementName。这样就可以避免相同的id导致地址被覆盖。

$form->select('column', 'label')->setElementName('s1');
$form->select('column', 'label')->setElementName('s2');

非常感谢!!!解决了,好像->setElementName('s1') 要放在->ajax()之前。

hi 刚刚发现setElementName会导致select提交的name变更,所还推荐改为使用setElementClass

Johan-An commented 2 years ago

因为radio的联动切换只是切换多个层的显示和隐藏。你层内的select使用了相同的id,而select是通过className(未设置的话默认值和id相等)来绑定ajax的地址的,所以会被覆盖。 解决方式就是如果设置了elementName,则优先使用elementName。这样就可以避免相同的id导致地址被覆盖。

$form->select('column', 'label')->setElementName('s1');
$form->select('column', 'label')->setElementName('s2');

非常感谢!!!解决了,好像->setElementName('s1') 要放在->ajax()之前。

hi 刚刚发现setElementName会导致select提交的name变更,所还推荐改为使用setElementClass 是的,表单刚刚提交不上去了,现在可以了