angular.module('demo', []).controller("ctrl", function ($scope) {
$scope.list = [];
var max = 10;
for(var i = 0; i < max; i++){
$scope.list.push({id: i, text: "Element " + i});
}
$scope.selected = $scope.list[0];
}).directive('customSelect', function(){
var template= "<div class='selectContainer' tabindex='0' ng-class='{\"expanded\": isExpanded}' ng-click='toggleExpand();' ng-blur='close();' > <div class='selectDisplay' >{{getDisplay(model);}}</div><div class='arrow'></div><ul class='selectOptions'><li class='selectOption' ng-class='{\"selectedOpt\": model == opt}' ng-click='selectValue(opt);' ng-repeat='opt in options'>{{getDisplay(opt);}}</li></ul></div>";
function link(scope){
scope.getDisplay = function getDisplay(opt){
return opt[scope.displayAttribute];
};
scope.isExpanded = false;
scope.selectValue = function selectValue(opt){
scope.model = opt;
//scope.close();
};
scope.toggleExpand = function toggleExpand(){
scope.isExpanded = !scope.isExpanded;
if (scope.isExpanded){
}
}
scope.close = function close(){
scope.isExpanded = false;
};
}
return {
restrict: "E",
link: link,
template: template,
scope:{
model: '=',
options: '=',
displayAttribute: '='
}
};
});
<div id='container' ng-controller="ctrl">
<custom-select model='selected' options='list' display-attribute="'text'" >
</custom-select>
<input type='text' ng-model='selected.text'></input>
</div>
.selectContainer{
height:20px;
border: 1px solid #343239;
color:#89c2da;
border-radius:6px;
cursor:default;
position relative;
}
html{
background-color:#18151e;
}
.selectContainer.expanded .selectOptions{
display:block;
}
.selectDisplay{
}
.selectOptions{
display:none;
list-style:none;
padding:0;
border: 1px solid #343239;
color:#89c2da;
margin: 0;
position: relative;
background-color: #18151e;
}
.selectOption:hover{
color: #18151e;
background-color:#89c2da;
}
.selectOption.selectedOpt{
color: #18151e;
background-color:#89c2da;
}
.selectContainer .arrow{
position: absolute;
height:0;
width: 0;
border-top: 10px solid #89c2da;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
right: 15px;
top: 15px;
}