diff --git a/packages/table/src/table-store.js b/packages/table/src/table-store.js index b7004de0b..953b03814 100644 --- a/packages/table/src/table-store.js +++ b/packages/table/src/table-store.js @@ -313,21 +313,31 @@ TableStore.prototype.updateAllSelected = function() { }; let isAllSelected = true; + let selectedCount = 0; for (let i = 0, j = data.length; i < j; i++) { const item = data[i]; if (selectable) { - if (selectable.call(null, item, i) && !isSelected(item)) { - isAllSelected = false; - break; + const isRowSelectable = selectable.call(null, item, i); + if (isRowSelectable) { + if (!isSelected(item)) { + isAllSelected = false; + break; + } else { + selectedCount++; + } } } else { if (!isSelected(item)) { isAllSelected = false; break; + } else { + selectedCount++; } } } + if (selectedCount === 0) isAllSelected = false; + states.isAllSelected = isAllSelected; }; diff --git a/test/unit/specs/table.spec.js b/test/unit/specs/table.spec.js index 90473796d..26fa2d374 100644 --- a/test/unit/specs/table.spec.js +++ b/test/unit/specs/table.spec.js @@ -623,6 +623,48 @@ describe('Table', () => { }, DELAY); }); + it('selectable === false & check selectAll status', done => { + const vm = createVue({ + template: ` + + + + + + + + `, + + created() { + }, + + data() { + return { selected: [], testData: null }; + }, + + methods: { + change(rows) { + this.selected = rows; + }, + + filterSelect(row, index) { + return false; + } + } + }, true); + + vm.testData = getTestData(); + + setTimeout(_ => { + expect(vm.$el.querySelector('.el-checkbox').__vue__.checked).to.be.false; + setTimeout(_ => { + expect(vm.selected).to.length(0); + destroyVM(vm); + done(); + }, DELAY); + }, DELAY); + }); + it('emit selection-change after row has been removed', done => { const vm = createVue({ template: `