瀏覽代碼

Select: fix default-first-option with remote

make default-first-option work with async filter/remote method
test is updated to reflect this change
wacky6.AriesMBP 8 年之前
父節點
當前提交
bd2e172fa3
共有 2 個文件被更改,包括 33 次插入18 次删除
  1. 24 17
      packages/select/src/select.vue
  2. 9 1
      test/unit/specs/select.spec.js

+ 24 - 17
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;
+            }
+          }
+        }
       }
     },
 

+ 9 - 1
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);
   });