forked from Siyfion/angular-typeahead
-
Notifications
You must be signed in to change notification settings - Fork 0
/
angular-typeahead.js
61 lines (52 loc) · 2.37 KB
/
angular-typeahead.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
angular.module('siyfion.sfTypeahead', [])
.directive('sfTypeahead', function () {
return {
restrict: 'AC', // Only apply on an attribute or class
scope: {
value: '=ngModel', // The two-way data bound value that is returned by the directive
options: '=', // The typeahead configuration options (https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md#options)
datasets: '=' // The typeahead datasets to use (https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md#datasets)
},
link: function (scope, element) {
// Create the typeahead on the element
element.typeahead(scope.options, scope.datasets);
function updateScope (object, suggestion, dataset) {
// for some reason $apply will place [Object] into element, this hacks around it
var preserveVal = element.val();
scope.$apply(function () {
scope.value = suggestion;
});
element.val(preserveVal);
}
// Update the value binding when a value is manually selected from the dropdown.
element.bind('typeahead:selected', function(object, suggestion, dataset) {
updateScope(object, suggestion, dataset);
scope.$emit('typeahead:selected');
});
// Update the value binding when a query is autocompleted.
element.bind('typeahead:autocompleted', function(object, suggestion, dataset) {
updateScope(object, suggestion, dataset);
scope.$emit('typeahead:autocompleted');
});
// Propagate the opened event
element.bind('typeahead:opened', function(){
scope.$emit('typeahead:opened');
});
// Propagate the closed event
element.bind('typeahead:closed', function(){
scope.$emit('typeahead:closed');
});
// Propagate the cursorchanged event
element.bind('typeahead:cursorchanged', function(event, suggestion, dataset){
scope.$emit('typeahead:cursorchanged', event, suggestion, dataset);
});
// Update the value binding when the user manually enters some text
element.bind('input', function () {
scope.$apply(function () {
var value = element.val();
scope.value = value;
});
});
}
};
});