From bd2e172fa3fd82c512990c5155576d448af521be Mon Sep 17 00:00:00 2001 From: "wacky6.AriesMBP" <416707889@qq.com> Date: Fri, 26 May 2017 17:15:30 +0800 Subject: [PATCH] Select: fix default-first-option with remote make default-first-option work with async filter/remote method test is updated to reflect this change --- packages/select/src/select.vue | 41 ++++++++++++++++++++-------------- test/unit/specs/select.spec.js | 10 ++++++++- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/packages/select/src/select.vue b/packages/select/src/select.vue index d1edc06c6..fab9aae8a 100644 --- a/packages/select/src/select.vue +++ b/packages/select/src/select.vue @@ -266,23 +266,7 @@ this.broadcast('ElOptionGroup', 'queryChange'); } if (this.defaultFirstOption && (this.filterable || this.remote) && this.filteredOptionsCount) { - this.hoverIndex = -1; - for (let i = 0; i !== this.options.length; ++i) { - const option = this.options[i]; - if (val) { - // pick first options that passes the filter - if (!option.disabled && !option.groupDisabled && option.visible) { - this.hoverIndex = i; - break; - } - } else { - // pick currently selected option - if (option.itemSelected) { - this.hoverIndex = i; - break; - } - } - } + this.checkDefaultFirstOption(); } }, @@ -346,6 +330,9 @@ if ([].indexOf.call(inputs, document.activeElement) === -1) { this.setSelected(); } + if (this.defaultFirstOption && (this.filterable || this.remote) && this.filteredOptionsCount) { + this.checkDefaultFirstOption(); + } } }, @@ -651,6 +638,26 @@ handleResize() { this.resetInputWidth(); if (this.multiple) this.resetInputHeight(); + }, + + checkDefaultFirstOption() { + this.hoverIndex = -1; + for (let i = 0; i !== this.options.length; ++i) { + const option = this.options[i]; + if (this.query) { + // pick first options that passes the filter + if (!option.disabled && !option.groupDisabled && option.visible) { + this.hoverIndex = i; + break; + } + } else { + // pick currently selected option + if (option.itemSelected) { + this.hoverIndex = i; + break; + } + } + } } }, diff --git a/test/unit/specs/select.spec.js b/test/unit/specs/select.spec.js index 1dc92be2c..958648dbe 100644 --- a/test/unit/specs/select.spec.js +++ b/test/unit/specs/select.spec.js @@ -426,6 +426,14 @@ describe('Select', () => { options: ['1', '2', '3', '4', '5'], value: '' }; + }, + methods: { + filterMethod(query) { + // simulate async filterMethod / remoteMethod + setTimeout(() => { + this.options.filter(option => option.label.indexOf(query) !== -1); + }, 5); + } } }, true); @@ -443,7 +451,7 @@ describe('Select', () => { expect(select.value).to.equal('3'); done(); }, 10); - }, 10); + }, 10); // wait for async filterMethod }, 10); });