layui表格中JS控制Switch开关联动切换逻辑

作者:函数茶馆时间:2026-10-23 10:47:52浏览:587

本文介绍在layui表格中通过JavaScript实现两个switch开关的联动控制。当主键开关开启时,自动将允许为空开关置为关闭并修改样式;当允许为空尝试开启时,若主键已开启则拦截操作并提示。核心涉及templet模板定义、form.on监听事件及DOM元素状态同步。

Switch开关联动需求说明

需求场景:在表格交互中,当【主键】列的开关状态切换为“T”(开启)时,【允许为空】列的开关必须自动切换为“F”(关闭),且不可手动选择“T”。

反向逻辑:当【允许为空】列尝试切换为“T”(开启)时,需校验【主键】的状态。若【主键】当前为“T”,则阻止此次更改,弹出提示框告知用户,并保持原状。

Switch开关联动需求说明

Switch开关联动需求说明

Switch开关联动需求说明

Switch控件定义与模板配置

首先,需要在layui表格配置中添加switch控件。

定义主键列:使用templet模板渲染控件,通过{{ d.isSerial == 'T' ? 'checked' : '' }}表达式设置开关的默认选中状态。


{field :'isSerial' , title :'主键', minWidth : 120, templet: '#switchTpl', unresize : true	}

<!-- 定义是否主键的开关 -->
<script id="switchTpl" type="text/html">
<!-- 这里的 checked 的状态是-->
<input type="checkbox" name = "ifKey" value = {{d.colNo}} lay-skin="switch" lay-text="T|F" lay-filter="ifKeyDemo" {{ d.isSerial == 'T' ? 'checked' : '' }}>
</script>

定义允许为空列:同样使用templet模板定义对应的switch控件。


{field :'notNull' , title :'允许为空' , minWidth : 100, templet : '#switchNullTpl', unresize : true}

<!-- 定义是否允许为空的开关 -->
<script id="switchNullTpl" type="text/html">
<input type="checkbox" name="ifNull" value="{{d.colNo}}" lay-skin="switch" lay-text="T|F" lay-filter="ifNullDemo" {{ d.notNull == 'T' ? 'checked' : '' }}>
</script>

JS监听逻辑与状态同步实现

添加监听逻辑:通过lay-filter属性绑定事件监听器,重点处理开关切换时的数据同步与UI更新。


// 给对象主键赋值              
tableData[parentTrIndex].isSerial = "T";       
// 获取允许为空的div             
var switchIfNull=$(parentTr).find("td:eq(6)").find("div:eq(1)"); 
// 修改div的样式为F的样式,F的值            
switchIfNull.prop("class","layui-unselect layui-form-switch");//F的样式
switchIfNull.find("em").text("F");  //F的值       
tableData[parentTrIndex].notNull = "F"; //修改数据中F的值 

在特定条件下使用layer.tips('此列为主键,不允许为空',obj.othis); 显示提示信息。


// 主键                  
 form.on('switch(ifKeyDemo)', function(obj){	        
	// 获取当前控件                
	var selectIfKey=obj.othis;            
	// 获取当前所在行                
	var parentTr = selectIfKey.parents("tr");        
	// 获取当前所在行的索引               
	var parentTrIndex = parentTr.attr("data-index");       
	                   
	if(obj.elem.checked == true){//是主键          
		// 给对象主键赋值               
		tableData[parentTrIndex].isSerial = "T";        
		// 获取允许为空的div              
		var switchIfNull=$(parentTr).find("td:eq(6)").find("div:eq(1)");  
		// 修改div的样式为F的样式,F的值             
		switchIfNull.prop("class","layui-unselect layui-form-switch");//F的样式 
		switchIfNull.find("em").text("F");         
		tableData[parentTrIndex].notNull = "F";        
                    
		layer.lips('此列为主键,不允许为空',obj.othis);         
	}else{                 
		// 给对象赋值                
		tableData[parentTrIndex].isSerial = "F";        
	}                  
	                   
});                   

添加对【允许为空】开关的监听:逻辑与主键监听类似,但需增加对主键状态的判断。


// 允许为空                  
form.on('switch(ifNullDemo)', function(obj){         
	// 获取当前控件                 
	var selectIfKey=obj.othis;            
	// 获取当前所在行                
	var parentTr = selectIfKey.parents("tr");         
	// 获取当前所在行的索引                
	var parentTrIndex = parentTr.attr("data-index");       
	// 获取“是否主键”的值                
	var ifKey=parentTr.find(('td:eq(2)')).text().trim();      
	if(ifKey == "T"){               
		// 给对象赋值                
		// 获取允许为空的div               
		var switchIfNull=$(parentTr).find("td:eq(6)").find("div:eq(1)");  
		// 修改div的样式为F的样式,F的值             
		switchIfNull.prop("class","layui-unselect layui-form-switch");//F的样式 
		switchIfNull.find("em").text("F");         
		tableData[parentTrIndex].notNull = "F";        
                    
		layer.alert('此列为主键,不允许为空;若要为空,请更改主键');        
		                  
	}else{                 
		if(obj.elem.checked == true){//允许为空			       
			// 给对象赋值               
			tableData[parentTrIndex].notNull = "T";       
			                 
		}else{                
			// 给对象赋值               
			tableData[parentTrIndex].notNull = "F";       
		}                  
	}                   
	                   
}); 		                 

以上即为layui中通过JS控制switch开关联动的完整实现方案,供参考使用。

作者最新文章