javascript - 隐藏和显示输入 - 动态表单 Yii2
问题描述
我有在 Yii2 上工作的动态表单 wbraganca,但是我需要添加一个小功能来在选择下拉列表选项时隐藏一个字段,并在每个新的动态表单中执行此操作。目前我可以做到,但只能以第一种动态方式。
_形式
<? = $form->field ( $modelQuestion , "[{$indexQuestion}]question" )->dropDownList (
ArrayHelper::map ( QuestType::find ()->all () , 'id' , 'description' ) , [
'prompt' => '-- Select Question --'
] );
?>
<?= $form->field ( $modelQuestion , "[{$indexQuestion}]add-options" )->label ( false )->textInput ( [ 'maxlength' => true ] ) ?>
JS
$("#questions-0-question").change(function(){
var op=document.getElementById("questions-0-question");
if (op.selectedIndex == 3) {
$('#add-options').hide();
}else {
$('#add-options').show();
}
});
解决方案
您只需要定位.dynamicform-wrapper
保存您在运行时添加的动态表单输入的对象,您应该使用事件委托,它会自动处理新添加的输入。
要检测相关字段,您可以使用正则表达式提取当前行的模型和索引,这些模型和索引以均值的格式附加到动态输入中,modelname-index
如果我有一个问题模型以动态形式加载,那么输入question_title
将具有一个id question-1-question_title
,然后以此类推。
使用表达式
/^([a-zA-Z]+)\-([0-9]+)/g
匹配模型名称并将其附加到您尝试隐藏的相关输入。
在您的视图顶部添加以下代码
$JS = <<< JS
$(".dynamicform_wrapper").on("change","select",function(){
var id=$(this).attr("id");
var optionsInput=id.match(/^([a-zA-Z]+)\-([0-9]+)/g)[0]+'-add-options';
if ($(this).val()== 3) {
$('#'+optionsInput).hide();
}else {
$('#'+optionsInput).show();
}
});
JS;
$this->registerJs($JS, yii\web\View::POS_READY);
推荐阅读
- wpf - 如何创建和使用外部 XAML 图像的 ResourceDictionary
- javascript - 为什么我没有为这个变量定义?
- postgresql - 有没有办法显示事务期间在 PostgreSQL 数据库中更改的所有内容?
- python - 生成随机故事的函数总是返回相同的输出
- unity3d - Unity2D播放器跳跃不一致
- javascript - Laravel Mix Javascript 未定义函数 onClick
- android - Face().boundingBox 返回负数 Rect().left
- node.js - 节点模块 argon2 “/usr/lib/x86_64-linux-gnu/libstdc++.so.6:找不到版本‘CXXABI_1.3.8’”
- javascript - JavaScript中对象之间的区别
- extjs - Extjs Grid - 基于内容的适合高度?