diff --git a/src/typeahead/docs/demo.html b/src/typeahead/docs/demo.html
index d14f6a46e4..4568dc4fb1 100644
--- a/src/typeahead/docs/demo.html
+++ b/src/typeahead/docs/demo.html
@@ -1,4 +1,4 @@
\ No newline at end of file
diff --git a/src/typeahead/docs/demo.js b/src/typeahead/docs/demo.js
index 370655c956..1587b5d988 100644
--- a/src/typeahead/docs/demo.js
+++ b/src/typeahead/docs/demo.js
@@ -2,4 +2,11 @@ function TypeaheadCtrl($scope) {
$scope.selected = undefined;
$scope.states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Dakota', 'North Carolina', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming'];
+
+ $scope.testFormatter = function(item){
+ if ( item ) {
+ return item.toUpperCase();
+ }
+ return item;
+ };
}
\ No newline at end of file
diff --git a/src/typeahead/typeahead.js b/src/typeahead/typeahead.js
index 3614f1b239..f889a3392b 100644
--- a/src/typeahead/typeahead.js
+++ b/src/typeahead/typeahead.js
@@ -46,6 +46,9 @@ angular.module('ui.bootstrap.typeahead', [])
//expressions used by typeahead
var parserResult = typeaheadParser.parse(attrs.typeahead);
+ //optional formatter for the input field
+ var formatter = originalScope.$eval(attrs.typeaheadInputFormatter);
+
//create a child scope for the typeahead directive so we are not polluting original scope
//with typeahead-specific data (matches, query etc.)
var scope = originalScope.$new();
@@ -112,8 +115,16 @@ angular.module('ui.bootstrap.typeahead', [])
modelCtrl.$render = function () {
var locals = {};
+
locals[parserResult.itemName] = selected || modelCtrl.$viewValue;
- element.val(parserResult.viewMapper(scope, locals) || modelCtrl.$viewValue);
+ var viewValue = parserResult.viewMapper(scope, locals) || modelCtrl.$viewValue;
+ var modelValue;
+
+ if ( formatter ){
+ modelValue = parserResult.modelMapper(scope, locals);
+ viewValue = formatter(modelValue) || viewValue;
+ }
+ element.val(viewValue);
selected = undefined;
};
@@ -122,8 +133,8 @@ angular.module('ui.bootstrap.typeahead', [])
var locals = {};
locals[parserResult.itemName] = selected = scope.matches[activeIdx].model;
- modelCtrl.$setViewValue(parserResult.modelMapper(scope, locals));
- modelCtrl.$render();
+ originalScope[attrs.ngModel] = parserResult.modelMapper(scope, locals);
+ resetMatches();
};
//bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)