diff --git a/docs/examples/demo-header-and-footer.html b/docs/examples/demo-header-and-footer.html
new file mode 100644
index 000000000..3fd4f615a
--- /dev/null
+++ b/docs/examples/demo-header-and-footer.html
@@ -0,0 +1,17 @@
+
Basic Header and Footer
+Selected: {{ctrl.address.selected.formatted_address}}
+
+ {{$select.selected.formatted_address}}
+ Simple Header
+
+
+
+ Simple Footer
+
diff --git a/src/uiSelectDirective.js b/src/uiSelectDirective.js
index cded3d463..e51eb8aea 100644
--- a/src/uiSelectDirective.js
+++ b/src/uiSelectDirective.js
@@ -227,6 +227,33 @@ uis.directive('uiSelect',
if (transcludedNoChoice.length == 1) {
element.querySelectorAll('.ui-select-no-choice').replaceWith(transcludedNoChoice);
}
+
+ var transcludedHeader = transcluded.querySelectorAll('.ui-select-header');
+ var transcludedFooter = transcluded.querySelectorAll('.ui-select-footer');
+ if((transcludedHeader && transcludedHeader.length) || (transcludedFooter && transcludedFooter.length)){
+ $timeout(function(){
+ var selectChoices = element.querySelectorAll('.ui-select-choices');
+
+ if(transcludedHeader && transcludedHeader.length){
+ transcludedHeader.removeAttr('ui-select-header'); // To avoid loop in case directive as attr
+ transcludedHeader.removeAttr('ng-transclude'); // Content has already been transcluded
+ transcludedHeader.removeAttr('data-ui-select-header'); // Properly handle HTML5 data-attributes
+ transcludedHeader.removeAttr('data-ng-transclude');
+ selectChoices.prepend(transcludedHeader);
+ }
+
+ if(transcludedFooter && transcludedFooter.length){
+ transcludedFooter.removeAttr('ui-select-footer'); // To avoid loop in case directive as attr
+ transcludedFooter.removeAttr('ng-transclude'); // Content has already been transcluded
+ transcludedFooter.removeAttr('data-ui-select-footer'); // Properly handle HTML5 data-attributes
+ transcludedFooter.removeAttr('data-ng-transclude');
+ selectChoices.append(transcludedFooter);
+ }
+
+ // re-compile selectChoices in case header or footer requires one of ui-select-choice's directives
+ $compile(selectChoices)(scope);
+ });
+ }
});
// Support for appending the select field to the body when its open
diff --git a/src/uiSelectFooterDirective.js b/src/uiSelectFooterDirective.js
new file mode 100644
index 000000000..796629bef
--- /dev/null
+++ b/src/uiSelectFooterDirective.js
@@ -0,0 +1,8 @@
+uis.directive('uiSelectFooter', function(){
+ return {
+ template: '',
+ restrict: 'EA',
+ transclude: true,
+ replace: true
+ };
+});
\ No newline at end of file
diff --git a/src/uiSelectHeaderDirective.js b/src/uiSelectHeaderDirective.js
new file mode 100644
index 000000000..370b00af0
--- /dev/null
+++ b/src/uiSelectHeaderDirective.js
@@ -0,0 +1,8 @@
+uis.directive('uiSelectHeader', function(){
+ return {
+ template: '',
+ restrict: 'EA',
+ transclude: true,
+ replace: true
+ };
+});
\ No newline at end of file