Skip to content

Commit ddee303

Browse files
VdustRmarcosmoura
authored andcommitted
fix(MdTable): reactive selection (#1674)
* fix(MdTable): reactive selection fix #1348 * fix(MdTableRow): add addSelectableItem on nextTick to avoid destory after created * fix(MdTable): mdModelId necessary warning * fix(MdTableCellSelection): replace created with watch immediate * fix(MdTable): fix warn message * fix(MdTable): Generate UUID by object instance with WeakMap to avoid breaking change * fix(MdTable): remove unused Vue
1 parent 09b8573 commit ddee303

File tree

4 files changed

+43
-28
lines changed

4 files changed

+43
-28
lines changed

src/components/MdTable/MdTable.vue

+15-5
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
<tbody v-else-if="value.length">
2828
<md-table-row-ghost
2929
v-for="(item, index) in value"
30-
:key="getRowId(item[mdModelId])"
31-
:md-id="getRowId(item[mdModelId])"
30+
:key="getRowId(item, mdModelId)"
31+
:md-id="getRowId(item, mdModelId)"
3232
:md-index="index"
3333
:md-item="item">
3434
<slot name="md-table-row" :item="item" />
@@ -153,7 +153,8 @@
153153
getModel: this.getModel,
154154
getModelItem: this.getModelItem,
155155
selectingMode: null
156-
}
156+
},
157+
itemsUuidMap: new WeakMap()
157158
}
158159
},
159160
computed: {
@@ -263,12 +264,21 @@
263264
emitEvent (eventName, value) {
264265
this.$emit(eventName, value)
265266
},
266-
getRowId (id) {
267+
getRowId (item, propertyName) {
268+
let id = item[propertyName]
269+
267270
if (id) {
268271
return id
269272
}
270273
271-
return 'md-row-' + MdUuid()
274+
id = this.itemsUuidMap.get(item)
275+
276+
if (!id) {
277+
id = 'md-row-' + MdUuid()
278+
this.itemsUuidMap.set(item, id)
279+
}
280+
281+
return id
272282
},
273283
setScroll ($event) {
274284
raf(() => {

src/components/MdTable/MdTableCellSelection.vue

+5-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@
2020
isSelected: false
2121
}),
2222
watch: {
23-
value () {
24-
this.isSelected = this.value
23+
value: {
24+
immediate: true,
25+
handler (value) {
26+
this.isSelected = value
27+
}
2528
}
2629
},
2730
methods: {

src/components/MdTable/MdTableRow.vue

+23-20
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<template>
22
<tr class="md-table-row" :class="rowClasses" @click="onClick" v-on="$listeners">
33
<md-table-cell-selection
4-
v-model="isSelected"
4+
:value="isMultipleSelected"
5+
@input="selected => selected ? addSelection() : removeSelection()"
56
:md-disabled="mdDisabled"
67
:md-selectable="mdSelectable === 'multiple'"
78
:md-row-id="mdIndex"
@@ -32,12 +33,14 @@
3233
},
3334
inject: ['MdTable'],
3435
data: () => ({
35-
index: null,
36-
isSelected: false
36+
index: null
3737
}),
3838
computed: {
3939
selectableCount () {
40-
return Object.keys(this.MdTable.selectable).length
40+
return this.MdTable.selectable.length
41+
},
42+
isMultipleSelected () {
43+
return this.MdTable.selectedItems.includes(this.mdItem)
4144
},
4245
isSingleSelected () {
4346
return this.MdTable.singleSelection === this.mdItem
@@ -52,7 +55,7 @@
5255
if (this.MdTable.hasValue) {
5356
return {
5457
'md-has-selection': !this.mdDisabled && (this.mdAutoSelect || this.hasSingleSelection),
55-
'md-selected': this.isSelected,
58+
'md-selected': this.isMultipleSelected,
5659
'md-selected-single': this.isSingleSelected
5760
}
5861
}
@@ -69,18 +72,6 @@
6972
this.addSelectableItem()
7073
}
7174
},
72-
isSelected (val) {
73-
let noChange = (val && this.isInSelectedItems) || (!val && !this.isInSelectedItems)
74-
75-
if (noChange) {
76-
return false
77-
}
78-
79-
this.MdTable.manageItemSelection(this.mdItem)
80-
},
81-
isInSelectedItems (val) {
82-
this.isSelected = val
83-
},
8475
mdSelectable () {
8576
this.MdTable.selectingMode = this.mdSelectable
8677
},
@@ -100,7 +91,17 @@
10091
}
10192
},
10293
toggleSelection () {
103-
this.isSelected = !this.isSelected
94+
this.MdTable.manageItemSelection(this.mdItem)
95+
},
96+
addSelection () {
97+
if (!this.isMultipleSelected) {
98+
this.MdTable.selectedItems.push(this.mdItem)
99+
}
100+
},
101+
removeSelection () {
102+
if (this.isMultipleSelected) {
103+
this.MdTable.selectedItems = this.MdTable.selectedItems.filter(target => target !== this.mdItem)
104+
}
104105
},
105106
selectRowIfSingle () {
106107
if (this.MdTable.singleSelection === this.mdItem) {
@@ -132,8 +133,10 @@
132133
}
133134
},
134135
created () {
135-
this.addSelectableItem()
136-
this.MdTable.selectingMode = this.mdSelectable
136+
this.$nextTick(() => {
137+
this.addSelectableItem()
138+
this.MdTable.selectingMode = this.mdSelectable
139+
})
137140
},
138141
beforeDestroy () {
139142
this.removeSelectableItem()

src/components/MdTable/MdTableRowGhost.vue

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<script>
22
export default {
33
name: 'MdTableRowGhost',
4-
abstract: true,
54
props: {
65
mdIndex: [String, Number],
76
mdId: [String, Number],

0 commit comments

Comments
 (0)