Wie im Bild gezeigt:
1. Die Tabellen auf der linken Seite werden dynamisch hinzugefügt, indem Sie oben auf die Schaltfläche „Hinzufügen“ klicken. Klicken Sie auf eine Zeile der Tabelle links, um rechts eine Tabelle zu erstellen (beliebig viele Zeilen reichen aus), mit einer Eins-zu-viele-Beziehung links und rechts.
2. Wenn Sie links eine neue Zeile hinzufügen möchten, erstellen Sie ein unabhängiges Objekt (d. h. jede Zeile entspricht einem anderen Objekt) und klicken Sie dann rechts auf „Hinzufügen“. Die neu erstellte Zeile verfügt dann über mehrere Dropdown-Menüs . Ja, nachdem der Benutzer mit der Auswahl fertig ist, klickt er, um mit dem Ausfüllen des Berichts zu beginnen. Wenn er auf die Schaltfläche „Bericht ausfüllen“ klickt, muss er die Daten auf der rechten Seite und die Daten auf der linken Seite in einem Objekt speichern Reihe links. (Jede Zeile auf der linken Seite entspricht einem Objekt)
3. Über der linken und rechten Tabelle befinden sich Schaltflächen zum Löschen. Wenn Sie links auf die Schaltfläche „Löschen“ klicken, wird das Speicherobjekt in dieser Zeile gelöscht Die dazugehörigen Daten werden nicht gelöscht. Wenn Sie rechts eine Zeile auswählen und auf „Löschen“ klicken, wird im Objekt links nur der Datenspeicher dieser Zeile rechts gelöscht.
Framework:
Verwendete Bootstrap-jQuery
Code:
<p class="col-md-5 clearfix">
<button class="button1">新增</button>
<button class="button1_del">删除</button>
<table border="1px solid #000" class="text-center">
<thead class="zType_thead text-center">
<tr>
<th></th>
<th>纳税人识别号</th>
<th>纳税人名称</th>
</tr>
</thead>
<tbody class="zType_tbody">
</tbody>
</table>
</p>
<p class="col-md-offset-1 col-md-5">
<button class="button2">新增</button>
<button class="button2_del">删除</button>
<button class="baocun_button" type="submit">开始填报</button>
<form class="clearfix" method="post">
<table class="zType_table text-center" border="1px solid #000">
<thead>
<tr class="zType_table_th">
<th>计算期类型</th>
<th>期间</th>
<th>征收方式</th>
</tr>
</thead>
<tbody class="zType_all">
</tbody>
</table>
</form>
</p>
js-Code:
//点击选中右侧表格的某一行
$('.zType_all').on('click','tr',function(){
//点击某一行 此行背景色改变,其他行恢复白色。点击的那一行添加了name属性,然后删除其他tr的name值,为的是之后联系起来,有个name属性作为桥梁,比如删除,就可以在删除掉对应带有name值的tr
$('.zType_all').children().css({"background":"#fff","color":"#000"}).removeAttr('name');
$(this).css({"background":"#bfaadc","color":"#000"});
if(!$(this).attr('name')){
$(this).attr("name",'zType_tr_checked1');
}
})
//右侧删除按钮 点击删除带有name的tr
$('.button2_del').on('click',function(){
$('tr[name=zType_tr_checked1]').remove();
})
//左侧添加按钮
$('.button1').on('click',function(){
$('.zType_tbody').append('<tr><td><span class="glyphicon glyphicon-chevron-right"></span></td><td><input type="text" name="shibiehao"></td><td><input type="text" name="mingcheng"></td></tr>');
})
//选中左侧表格的tr
$('.zType_tbody').on('click','tr',function(){
//依然还是点击某一行 此行背景色改变,其他行恢复白色。点击的那一行添加了name属性,然后删除其他tr的name值,为的是之后联系起来,有个name属性作为桥梁,比如删除,就可以在删除掉对应带有name值的tr
$('.zType_tbody').children().css({"background":"#fff"}).removeAttr('name');
$(this).css({"background":"#bfaadc"}).children().eq(0).children()
if(!$(this).attr('name')){
$(this).attr("name",'zType_tr_checked2');
}
})
//点击左侧删除按钮,删掉左侧选中的tr
$('.button1_del').on('click',function(){
$('tr[name=zType_tr_checked2]').remove();
})
简单说下我的思路:每个 DOM 结构维护一个数据对象,假设你的 HTML 结构为(emmet语法):
那么:
上面分为三个组件
.app-test
负责维护所有纳税人数据(即左侧表格);左侧列表的每个 tr 维护对应纳税人的数据(即右侧表格);
两侧的所有 tr 都可以视为一个小的组件 —— 麻雀虽小五脏俱全;
总结出为:
整个功能组件 > 左侧 tr 组件 + 右侧 tr 组件
;你可以理解为父子组件传值;
大致实现如下:
首先,两个表格属于一个功能模块,假设为
TaxesReport
:TaxesReportTaxpayer 和 TaxesReportReporter 都需要传入一个 TaxesReport 实例,用于【子组件调用父组件】 方法或数据
点击左侧新建按钮新建纳税人:
右侧新增纳税人的报表类型,如:
删除的时候,除了删除对应的 tr 结构,删除 tr 对应的数据,涉及到的两个数据对象(左侧的
taxpayers
和 右侧的reports
) 都是数组结构,你可以为自定义键名方法,为新的实例(纳税人或报表)创建唯一标识,并使用<tr data-identify="唯一标识">···</tr>
建立起取值参数。鉴于你可能都是静态数据(非从数据库中取出的带有主键标识的数据),且可能删除数组中的任意一个条目进而导致数组下标丢失,所以,最好的方法是建立一个可创建不重复值的方法,用以给生成的组件(左侧或右侧)生成并添加一个唯一标识。
产生一个数据缓存,在 key-model 的形式保存数据,右边的 model 里有一个 children 保存对应的右侧数据
左侧切换的时候,直接从 key-model 数据缓存里找到对应的 model.children,重绘右侧的列表
左侧添加删除的时候对应的从 key-model 数据缓存里添加删除就好
右侧添加删除的时候也是一样的,这个时候可以对找到对应的 model.children
由于使用 jQuery,jQuery 可以通过
data()
把数据附加到 DOM 上,所以上述 key-model 可以直接采用之种形式把每个 model 附加到每行(左侧)的 DOM 上,右侧附加不附加问题都不大思路如此,代码你可以先尝试写下