var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {

});

app.directive('list', function() {
  return {
    restrict: 'A',
    require: '?ngModel',
    link: function(s, e, attr, ctrl) {
      if (ctrl && e[0].nodeName === 'INPUT') {
        console.log('do');
        e.data('ngModelName', attr.ngModel);
      }
    }
  }
});

app.directive('datalist', function($compile) {
  var supportsDatalist = !!('list' in document.createElement('input')) && 
            !!(document.createElement('datalist') && window.HTMLDataListElement);
  
  return {
    restrict: 'E',
    transclude: true,
    link: function(s, e, a, c, t) {
      if (!supportsDatalist) {
        var listId = a.id;
        //Assumes inputs that use datalist are unique. A better directive would probably include the input itself
        var input = document.querySelectorAll("input[list="+ listId +"]")
        input = input[0];
        
        var ngModelName = angular.element(input).data('ngModelName');
        
        var select = $compile('<select ng-model="'+ngModelName+'"></select>')(s);
        
        e.append(select);
        
        e = select;
      }
      
      t(function(te) {
        e.append(te);
      })
    }
  }
});
<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.4.x" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js" data-semver="1.4.7"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    Enter contact's name:
    <input type="text" list="contacts" ng-model="selectedContact"  />
    
    <datalist id="contacts">
      <option value="John">John</option>
      <option value="Kyle">Kyle</option>
    </datalist>
    
    {{selectedContact | json}}
  </body>

</html>
/* Put your css in here */