为了账号安全,请及时绑定邮箱和手机立即绑定

Yii2 使用 Select2 和 yii2-formwizard 的表格步骤

Yii2 使用 Select2 和 yii2-formwizard 的表格步骤

慕神8447489 2021-09-30 18:00:32
我正在使用yii2-formwizard,它是我的项目中的一个方便的工具kartik\select2。一切正常,除非当我按添加以获取select2前一组的下一组下拉菜单消失时。当我修改我的控制器以从我的模型中捕获数据时会发生这种情况,如我上一篇文章所述,我在脚本方面遗漏了一些东西我在 jquery/JS 等方面有点差,无论如何,除了数据被保存并且小部件工作完美之外我的控制器<?phppublic function actionCreatemulti(){    $this->layout = 'layout2';    $model = [new Todelete()];    $sex = [['id' => 1, 'name' => 'male'], ['id' => 2, 'name' => 'female']];    if (Yii::$app->request->isPost) {        $count = count(Yii::$app->request->post('Todelete', []));        //start the loop from 1 rather than 0 and use the $count for limit        for ($i = 1; $i < $count; $i++) {            $model[] = new Todelete();        }        if (Model::loadMultiple($model, Yii::$app->request->post()) && Model::validateMultiple($model)) {            foreach ($model as $md) {                $md->save(false);            }            return $this->render('index');        }    }    return $this->render('create', [        'model' => $model,        'sex' => $sex    ]);}
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

原因

你指出的问题确实存在,你说得对。但是这个问题与最近对kartik\select2 @V2.1.4.The demo links 的更改有关。 演示链接使用的是旧版本的 select2 V2.1.3,它没有dataset定义这个属性,因此可以正常工作。

小部件不会集成所有这些更改,而是留给正在集成小部件的用户

原因是不可能在插件中正确控制它,因为可能有用户想要使用的任何小部件,并且继续为每个其他小部件添加代码不是我会投票的。因此,更好的方法是为需要对元素进行预处理或后处理的特定操作提供事件触发器,用户可以根据需要调整其代码

故障排除

现在关于这个问题,有一个新的数据集属性data-select2-id,它保存 select2 绑定到的输入的名称,并且在克隆新元素后,该属性不会更新为导致旧的 select 元素消失的较新元素 id。

请参阅下面的图片,它来自我自己的代码,因此请忽略address-0-city字段名称,因为它与您的代码无关,仅供理解

//img1.sycdn.imooc.com//61559d520001719410710048.jpg

解决方案

所以我们需要把afterInsert事件中的代码改成下面的


let selectElement = $(this).find('.field-todelete-'+params.rowIndex+'-sex > select');

let dataKrajee = eval(selectElement.data('krajee-select2'));


//update the dataset attribute to the

if (typeof selectElement[0].dataset.select2Id !== 'undefined') {


    //get the old dataset which has the old id of the input the select2 is bind to 

    let oldDataSelect2Id = selectElement[0].dataset.select2Id;


    //delete the old dataset

    delete selectElement[0].dataset.select2Id;


    //add the new dataselect pointing to the new id of the cloned element

    let newDataSelect2Id = oldDataSelect2Id.replace(

    /\-([\d]+)\-/,

    '-' + parseInt(params.rowIndex) + '-'

    );


    //add the new dataset with the new cloned input id 

    selectElement[0].dataset.select2Id= newDataSelect2Id;

}

selectElement.select2(dataKrajee);

我将在接下来的几天内更新 wiki 文档和代码示例以及演示中的代码。


希望能帮到你。


查看完整回答
反对 回复 2021-09-30
  • 2 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信