Angular中如何根据数据库获取的绑定值动态设置textbox宽度
Angular 动态适配输入框宽度纯模板实现方案
核心修改思路
之前设置min-width不生效的核心原因是uom列的td写死了40%固定宽度,输入框默认width:100%撑满父容器,只要父容器宽度大于内容宽度,就必然存在多余空白。
纯模板实现不需要写任何TS逻辑,靠CSS ch单位(1ch约等于当前字体下1个英文字符的宽度,适配文本长度精度足够)+ Angular样式绑定即可完成,同时调整表格列宽分配规则,让uom列宽度完全匹配内容长度,value列自动占满剩余空间。
修改后完整模板代码
<td formArrayName="entityAttributeInfo" *ngFor="let item of paramTypes.get('entityAttributeInfo')['controls']; let ii = index;"> <div [formGroupName]="ii" class="tabledataEquipmentNameInfo"> <table *ngIf="item.get('uom').value!=''" style="width:100%; table-layout: fixed;"> <tr *ngIf="item.get('uom').value!=''"> <!-- 移除写死的60%宽度,自动占满uom列之外的剩余空间 --> <td style="width: auto;"> <input formControlName="value" class="form-control" style="width: 100%; border-top-right-radius: 0px; border-bottom-right-radius: 0px;"> </td> <!-- 动态绑定宽度:字符长度+3ch余量,适配输入框内边距、边框 --> <td [style.width]="(item.get('uom').value?.length || 0) + 3 + 'ch'"> <input style="width: 100%; border-left: 0px; border-top-left-radius: 0px; border-bottom-left-radius: 0px;" formControlName="uom" class="form-control" [attr.disabled]="true" min-width="6ch" /> </td> </tr> </table> </div> </td>
关键配置说明
table-layout: fixed:固定表格布局算法,避免动态宽度导致的页面抖动,宽度计算更稳定- 宽度绑定值
(item.get('uom').value?.length || 0) + 3 + 'ch':取uom值的字符数作为基础宽度,多留3ch的余量适配form-control自带的左右内边距和边框,不会出现内容被挤压的情况;如果uom内容包含中文,把计算规则改成(item.get('uom').value?.length || 0)*2 + 3 + 'ch'即可(1个中文字符宽度约等于2ch) min-width="6ch":兜底配置,避免uom值过短时输入框太窄影响样式- 左侧value输入框设置
width:100%:保证撑满剩余列宽,不会出现布局缺口
页面初始化拉取数据、表单控件完成赋值后,Angular会自动触发样式绑定的重算,uom输入框会直接适配内容长度,不会出现多余空白。
内容的提问来源于stack exchange,提问作者Running Rabbit
相关产品推荐
相关产品推荐

