<el-table :data="druglist" stripe border @select="selectRow" @selection-change="handleSelectionChange"
@row-click="rowClick" ref="drugTable" :cell-class-name="getstyle" id="OrderQueryTable"
:cell-style="{ height: '40px' }" :row-class-name="tableRowClassName">
<el-table-column
type="selection"
width="45"
></el-table-column>
<el-table-column
prop="groupflag"
width
label="组方"
></el-table-column>
<el-table-column
prop="doflag"
width
label="标志"
></el-table-column>
<el-table-column
prop="ordertype"
width
label="状态"
></el-table-column>
<el-table-column
prop="orderflag"
width
label="类别"
></el-table-column>
</el-table>
selectRow(selection, row) {
//selection: 已选的数组。
//row: 当前点击或选中的行数据。
this.currentRow = row; //orderno 根据数据替换
let existsItem = selection.filter((s) => s.orderno == row.orderno);
if (existsItem.length == 1) {
//this.druglist 全部数据
for (let item1 of this.druglist) {
if (
row.setno == item1.setno &&
row.setno != "0" &&
row.setno != null &&
row.orderno != item1.orderno &&
row.orderflag1 != "Z"
) {
//drugTable 绑定在table上的ref
this.$refs.drugTable.toggleRowSelection(item1, true);
}
}
} else {
for (let item1 of this.druglist) {
if (
row.setno == item1.setno &&
row.setno != "0" &&
row.setno != null &&
row.orderno != item1.orderno &&
row.orderflag1 != "Z"
) {
this.$refs.drugTable.toggleRowSelection(item1, false);
}
}
}
},
rowClick(row, column, event) {
let now_k =null;
let tr =null;
if(event.path==undefined){
tr = $(event.currentTarget);
}else{
now_k = event.path[0];
tr = $(now_k).parents("tr");
}
let num = row.listNum;
let _this = this;
//加class到tr
if (tr.hasClass("s_clickLine")) {
tr.removeClass("s_clickLine");
_this.$refs.drugTable.toggleRowSelection(_this.druglist[num], false);
//触发原有的同时绑定和解除事件
_this.selectRow(_this.checkInfo, _this.druglist[num]);
} else {
tr.addClass("s_clickLine");
_this.$refs.drugTable.toggleRowSelection(_this.druglist[num], true);
//触发原有的同时绑定和解除事件
_this.selectRow(_this.checkInfo, _this.druglist[num]);
}
},
handleSelectionChange(val) {
let _this = this;
this.checkInfo = val;
_this.check_all_num = {};
$.each(val, function (i, n) {
_this.check_all_num[n.listNum] = n.listNum;
});
},
selectRow 函数以下是对这个函数的详细解释:
1. 参数:
selection: 包含已选项的数组。
row: 当前点击或选中的行数据。
2. 功能:
- 设置当前行: 将传入的 row 设置为当前行(this.currentRow)。
- 检查 selection 中是否存在与 row 有相同orderno 的项:
- 使用 filter 方法从 selection 数组中筛选出与 row 有相同 orderno 的项,并存储在 existsItem 中。
- 如果 existsItem 的长度为 1(即找到了一个匹配的项),则执行第一个 for 循环。
- 否则,执行第二个 for 循环。
3. 第一个 for 循环:
-
遍历 this.druglist(包含所有药品的列表)。
-
对于 this.druglist 中的每一项 item1,检查以下条件:
-
row.setno 与 item1.setno 相同。
-
row.setno 不是 “0” 且不是 null。
-
row.orderno 与 item1.orderno 不同。
-
row.orderflag1 不是 “Z”。
-
如果上述条件都满足,则使用 this.$refs.drugTable.toggleRowSelection(item1, true)
来选择 item1。
4. 第二个 for 循环:
- 它的逻辑与第一个 for 循环相似,但使用的是
this.$refs.drugTable.toggleRowSelection(item1, false) 来取消选择 item1。
总结:
- 当用户点击或选择某个 row 时,该函数首先检查 selection 中是否已存在与 row 有相同 orderno 的项。
- 如果存在,则选择 this.druglist 中与 row 有相同 setno 但不同 orderno 的所有项(但排除
orderflag1 为 “Z” 的项)。 - 如果不存在,则取消选择这些项。
这种逻辑用于某种特定的场景,例如,当选择一个药品订单时,可能需要自动选择或取消选择与该订单属于同一套餐(由 setno 标识)的其他药品订单。
rowClick 的方法,它用于处理表格行点击事件。下面是对代码的详细解释:
1. 参数:
- row: 被点击的行的数据对象。
- column: 被点击的列的信息(但在这段代码中并未使用)。
- event: 触发事件的 DOM 事件对象。
2. 变量声明:
- now_k: 用于存储事件路径中的第一个元素(如果可用)。
- tr: 用于存储被点击的 元素(表格行)。
3. 事件路径处理:
- 检查 event.path 是否存在。如果 event.path 是 undefined(在某些浏览器中可能不存在 event.path),则使用 event.currentTarget 来获取被点击的元素(通常是一个子元素),并通过 .parents(“tr”) 找到它的父 元素。
- 如果 event.path 存在,则取其第一个元素 now_k,并通过 .parents(“tr”) 找到它的父 元素。
4. 获取 listNum:
- 从传入的 row 对象中获取 listNum 属性,它用于标识表格行的唯一编号。
5. 存储 this 引用:
- 使用 _this 变量来存储 this 的引用,以便在后续的回调或函数中能够访问到正确的上下文。
6. 处理点击事件:
- 检查 tr 是否已经有 s_clickLine 这个 CSS 类。
- 如果有,则移除这个类,并通过 toggleRowSelection 方法取消选择对应的行(该方法用于切换行的选择状态)。
- 接着,调用 selectRow 方法(用于处理选中行后的一些逻辑,比如更新其他行的选择状态)。
- 如果 tr 没有 s_clickLine 这个 CSS 类,则添加这个类,并通过 toggleRowSelection 方法选择对应的行。
- 同样地,之后调用 selectRow 方法处理选中行后的逻辑。
注意: - event.path 不是所有浏览器都支持的标准属性。在一些浏览器中,你可能需要使用 event.composedPath() 来获取事件路径。
handleSelectionChange 的方法 下面是对代码的详细解释:
1. 变量声明:
- let _this = this;: 创建一个局部变量 _this,并将其设置为当前对象(通常是 Vue 实例、React 组件或其他任何 JavaScript 对象)。这样做通常是为了在回调函数中能够访问外部作用域的 this,因为回调函数内部的 this 可能会改变其指向。
2. 更新属性:
- this.checkInfo = val;: 将传入的 val 赋值给当前对象的 checkInfo 属性。
3. 初始化对象:
- _this.check_all_num = {};: 使用 _this(即 this)初始化一个空对象 check_all_num。
4. 遍历并赋值:
- 使用 jQuery 的 $.each 方法遍历 val 数组。对于 val 中的每个元素(这里用 n 表示),它执行一个回调函数。
- function (i, n) { … }: 这是一个回调函数,其中 i 是索引(对于数组),n 是当前元素的值。
- _this.check_all_num[n.listNum] = n.listNum;: 在这里,它尝试从当前元素 n 中访问 listNum 属性,并将该值作为键和值都添加到 _this.check_all_num 对象中。
总结:
- handleSelectionChange 方法接收一个数组 val 作为参数。
- 它将该数组赋值给当前对象的 checkInfo 属性。
- 它初始化一个空对象 check_all_num。
- 它遍历 val 数组,并将每个元素的 listNum 属性作为键和值添加到 check_all_num 对象中。
改进建议:
- 如果你的目的是简单地检查 val 数组中的哪些 listNum 存在,并创建一个只包含这些键的对象,那么只需将 n.listNum 作为键,并可以为其赋予一个特定的值(例如 true),而不是再次使用 n.listNum 作为值。
例如:
$.each(val, function (i, n) {
_this.check_all_num[n.listNum] = true; // 或其他你希望的值
});
这样,check_all_num 对象将只包含 val 数组中元素的 listNum 属性作为键,每个键对应的值都是 true(或其他你指定的值)。