diff --git a/src/components/autocomplete/autocomplete.spec.js b/src/components/autocomplete/autocomplete.spec.js index 8068ced18ab..928d4d615bd 100644 --- a/src/components/autocomplete/autocomplete.spec.js +++ b/src/components/autocomplete/autocomplete.spec.js @@ -58,6 +58,8 @@ describe('', function() { ctrl.keydown({ keyCode: $mdConstant.KEY_CODE.DOWN_ARROW, preventDefault: angular.noop }); ctrl.keydown({ keyCode: $mdConstant.KEY_CODE.ENTER, preventDefault: angular.noop }); scope.$apply(); + $timeout.flush(); + expect(scope.searchText).toBe('foo'); expect(scope.selectedItem).toBe(scope.match(scope.searchText)[0]); })); @@ -96,6 +98,8 @@ describe('', function() { ctrl.keydown({ keyCode: $mdConstant.KEY_CODE.DOWN_ARROW, preventDefault: angular.noop }); ctrl.keydown({ keyCode: $mdConstant.KEY_CODE.ENTER, preventDefault: angular.noop }); scope.$apply(); + $timeout.flush(); + expect(scope.searchText).toBe('foo'); expect(scope.selectedItem).toBe(scope.match(scope.searchText)[0]); })); @@ -153,6 +157,7 @@ describe('', function() { ctrl.select(0); element.scope().$apply(); + $timeout.flush(); expect(scope.searchText).toBe('foo'); expect(scope.selectedItem).not.toBeNull(); @@ -196,6 +201,7 @@ describe('', function() { ctrl.select(0); element.scope().$apply(); + $timeout.flush(); expect(scope.itemChanged).toHaveBeenCalled(); expect(scope.itemChanged.calls.mostRecent().args[0].display).toBe('foo'); diff --git a/src/components/autocomplete/js/autocompleteController.js b/src/components/autocomplete/js/autocompleteController.js index 1865544e5c2..160d69cc317 100644 --- a/src/components/autocomplete/js/autocompleteController.js +++ b/src/components/autocomplete/js/autocompleteController.js @@ -7,7 +7,7 @@ var ITEM_HEIGHT = 41, MENU_PADDING = 8; function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $timeout, $mdTheming, $window, - $animate, $rootElement, $attrs) { + $animate, $rootElement, $attrs, $q) { //-- private variables var ctrl = this, itemParts = $scope.itemsExpr.split(/ in /i), @@ -235,7 +235,9 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $timeout, $ */ function selectedItemChange (selectedItem, previousSelectedItem) { if (selectedItem) { - $scope.searchText = getDisplayValue(selectedItem); + getDisplayValue(selectedItem).then(function(val) { + $scope.searchText = val; + }); } if (angular.isFunction($scope.itemChange) && selectedItem !== previousSelectedItem) $scope.itemChange(getItemScope(selectedItem)); @@ -283,21 +285,26 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $timeout, $ ctrl.index = getDefaultIndex(); //-- do nothing on init if (searchText === previousSearchText) return; - //-- clear selected item if search text no longer matches it - if (searchText !== getDisplayValue($scope.selectedItem)) $scope.selectedItem = null; - else return; - //-- trigger change event if available - if (angular.isFunction($scope.textChange) && searchText !== previousSearchText) - $scope.textChange(getItemScope($scope.selectedItem)); - //-- cancel results if search text is not long enough - if (!isMinLengthMet()) { - ctrl.loading = false; - ctrl.matches = []; - ctrl.hidden = shouldHide(); - updateMessages(); - } else { - handleQuery(); - } + + getDisplayValue($scope.selectedItem).then(function(val) { + //-- clear selected item if search text no longer matches it + if (searchText !== val) $scope.selectedItem = null; + else return; + + //-- trigger change event if available + if (angular.isFunction($scope.textChange) && searchText !== previousSearchText) + $scope.textChange(getItemScope($scope.selectedItem)); + //-- cancel results if search text is not long enough + if (!isMinLengthMet()) { + ctrl.loading = false; + ctrl.matches = []; + ctrl.hidden = shouldHide(); + updateMessages(); + } else { + handleQuery(); + } + }); + } /** @@ -371,7 +378,7 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $timeout, $ * @returns {*} */ function getDisplayValue (item) { - return (item && $scope.itemText) ? $scope.itemText(getItemScope(item)) : item; + return (item && $scope.itemText) ? $q.when($scope.itemText(getItemScope(item))) : $q.when(item); } /** @@ -441,20 +448,24 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $timeout, $ * Selects the item at the given index. * @param index */ - function select (index) { - $scope.selectedItem = ctrl.matches[index]; - ctrl.loading = false; - ctrl.hidden = true; - ctrl.index = 0; - ctrl.matches = []; + function select(index) { //-- force form to update state for validation - $timeout(function () { - elements.$.input.controller('ngModel').$setViewValue(getDisplayValue($scope.selectedItem) || - $scope.searchText); - ctrl.hidden = true; + $timeout(function() { + getDisplayValue(ctrl.matches[index]).then(function(val) { + var ngModel = elements.$.input.controller('ngModel'); + ngModel.$setViewValue(val); + ngModel.$render(); + }).finally(function() { + $scope.selectedItem = ctrl.matches[index]; + ctrl.loading = false; + ctrl.hidden = true; + ctrl.index = 0; + ctrl.matches = []; + }); }); } + /** * Clears the searchText value and selected item. */ @@ -501,7 +512,9 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $timeout, $ * Updates the ARIA messages */ function updateMessages () { - ctrl.messages = [ getCountMessage(), getCurrentDisplayValue() ]; + getCurrentDisplayValue().then(function(msg) { + ctrl.messages = [ getCountMessage(), msg ]; + }); } /** diff --git a/src/components/autocomplete/js/autocompleteDirective.js b/src/components/autocomplete/js/autocompleteDirective.js index 879d69a75c0..e4bd170249c 100644 --- a/src/components/autocomplete/js/autocompleteDirective.js +++ b/src/components/autocomplete/js/autocompleteDirective.js @@ -158,7 +158,7 @@ function MdAutocomplete ($mdTheming, $mdUtil) { class="md-visually-hidden"\ role="status"\ aria-live="assertive">\ -

{{message}}

\ +

{{message}}

\ '; function getItemTemplate() { diff --git a/src/components/chips/chips.spec.js b/src/components/chips/chips.spec.js index b1d4fe1d00b..dd09e9a5a43 100644 --- a/src/components/chips/chips.spec.js +++ b/src/components/chips/chips.spec.js @@ -159,7 +159,8 @@ describe('', function() { element.scope().$apply(function() { autocompleteCtrl.select(0); }); - + $timeout.flush(); + expect(scope.items.length).toBe(4); expect(scope.items[3]).toBe('Kiwi'); }));