From 963ec0e6f4841c4c4c8637949e94003fab2f8ff1 Mon Sep 17 00:00:00 2001 From: Wesley Cho Date: Sat, 27 Jun 2015 15:23:56 -0700 Subject: [PATCH] fix(typeahead): add support for ngModelOptions getterSetter - Add support for getterSetter with ngModelOptions --- src/typeahead/test/typeahead.spec.js | 13 +++++++++++++ src/typeahead/typeahead.js | 18 ++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/typeahead/test/typeahead.spec.js b/src/typeahead/test/typeahead.spec.js index a86dcedd7e..510bfbdc6e 100644 --- a/src/typeahead/test/typeahead.spec.js +++ b/src/typeahead/test/typeahead.spec.js @@ -709,6 +709,19 @@ describe('typeahead tests', function () { expect($scope.test.typeahead.$error.parse).toBeUndefined(); }); + + it('issue #3823 - should support ng-model-options getterSetter', function () { + function resultSetter(state) { + return state; + } + $scope.result = resultSetter; + var element = prepareInputEl('
'); + + changeInputValueTo(element, 'Alaska'); + triggerKeyDown(element, 13); + + expect($scope.result).toBe(resultSetter); + }); }); describe('input formatting', function () { diff --git a/src/typeahead/typeahead.js b/src/typeahead/typeahead.js index 10b7778cf7..d768ecaa27 100644 --- a/src/typeahead/typeahead.js +++ b/src/typeahead/typeahead.js @@ -35,9 +35,10 @@ angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap var HOT_KEYS = [9, 13, 27, 38, 40]; return { - require:'ngModel', - link:function (originalScope, element, attrs, modelCtrl) { - + require:['ngModel', '^?ngModelOptions'], + link:function (originalScope, element, attrs, ctrls) { + var modelCtrl = ctrls[0]; + var ngModelOptions = ctrls[1]; //SUPPORTED ATTRIBUTES (OPTIONS) //minimal no of characters that needs to be entered before typeahead kicks-in @@ -67,7 +68,16 @@ angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap //INTERNAL VARIABLES //model setter executed upon match selection - var $setModelValue = $parse(attrs.ngModel).assign; + var parsedModel = $parse(attrs.ngModel); + var invokeModelSetter = $parse(attrs.ngModel + '($$$p)'); + var $setModelValue = function(scope, newValue) { + if (angular.isFunction(parsedModel(originalScope)) && + ngModelOptions && ngModelOptions.$options && ngModelOptions.$options.getterSetter) { + return invokeModelSetter(scope, {$$$p: newValue}); + } else { + return parsedModel.assign(scope, newValue); + } + }; //expressions used by typeahead var parserResult = typeaheadParser.parse(attrs.typeahead);