Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit 963ec0e

Browse files
committed
fix(typeahead): add support for ngModelOptions getterSetter
- Add support for getterSetter with ngModelOptions
1 parent eb3b32e commit 963ec0e

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

Diff for: src/typeahead/test/typeahead.spec.js

+13
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,19 @@ describe('typeahead tests', function () {
709709

710710
expect($scope.test.typeahead.$error.parse).toBeUndefined();
711711
});
712+
713+
it('issue #3823 - should support ng-model-options getterSetter', function () {
714+
function resultSetter(state) {
715+
return state;
716+
}
717+
$scope.result = resultSetter;
718+
var element = prepareInputEl('<div><input name="typeahead" ng-model="result" ng-model-options="{getterSetter: true}" typeahead="state as state.name for state in states | filter:$viewValue" typeahead-editable="false"></div>');
719+
720+
changeInputValueTo(element, 'Alaska');
721+
triggerKeyDown(element, 13);
722+
723+
expect($scope.result).toBe(resultSetter);
724+
});
712725
});
713726

714727
describe('input formatting', function () {

Diff for: src/typeahead/typeahead.js

+14-4
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap
3535
var HOT_KEYS = [9, 13, 27, 38, 40];
3636

3737
return {
38-
require:'ngModel',
39-
link:function (originalScope, element, attrs, modelCtrl) {
40-
38+
require:['ngModel', '^?ngModelOptions'],
39+
link:function (originalScope, element, attrs, ctrls) {
40+
var modelCtrl = ctrls[0];
41+
var ngModelOptions = ctrls[1];
4142
//SUPPORTED ATTRIBUTES (OPTIONS)
4243

4344
//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
6768
//INTERNAL VARIABLES
6869

6970
//model setter executed upon match selection
70-
var $setModelValue = $parse(attrs.ngModel).assign;
71+
var parsedModel = $parse(attrs.ngModel);
72+
var invokeModelSetter = $parse(attrs.ngModel + '($$$p)');
73+
var $setModelValue = function(scope, newValue) {
74+
if (angular.isFunction(parsedModel(originalScope)) &&
75+
ngModelOptions && ngModelOptions.$options && ngModelOptions.$options.getterSetter) {
76+
return invokeModelSetter(scope, {$$$p: newValue});
77+
} else {
78+
return parsedModel.assign(scope, newValue);
79+
}
80+
};
7181

7282
//expressions used by typeahead
7383
var parserResult = typeaheadParser.parse(attrs.typeahead);

0 commit comments

Comments
 (0)