code: function MdContactChips($mdTheming, $mdUtil) {
    return {
      template: function(element, attrs) {
        return MD_CONTACT_CHIPS_TEMPLATE;
      },
      restrict: 'E',
      controller: 'MdContactChipsCtrl',
      controllerAs: '$mdContactChipsCtrl',
      bindToController: true,
      compile: compile,
      scope: {
        contactQuery: '&mdContacts',
        placeholder: '@?',
        secondaryPlaceholder: '@?',
        contactName: '@mdContactName',
        contactImage: '@mdContactImage',
        contactEmail: '@mdContactEmail',
        contacts: '=ngModel',
        ngChange: '&?',
        requireMatch: '=?mdRequireMatch',
        minLength: '=?mdMinLength',
        highlightFlags: '@?mdHighlightFlags',
        chipAppendDelay: '@?mdChipAppendDelay',
        separatorKeys: '=?mdSeparatorKeys',
        removedMessage: '@?mdRemovedMessage',
        inputAriaDescribedBy: '@?inputAriaDescribedby',
        inputAriaLabelledBy: '@?inputAriaLabelledby',
        inputAriaLabel: '@?',
        containerHint: '@?',
        containerEmptyHint: '@?',
        deleteHint: '@?'
      }
    };
  
    function compile(element, attr) {
      return function postLink(scope, element, attrs, controllers) {
        var contactChipsController = controllers;
  
        $mdUtil.initOptionalProperties(scope, attr);
        $mdTheming(element);
  
        element.attr('tabindex', '-1');
  
        attrs.$observe('mdChipAppendDelay', function(newValue) {
          contactChipsController.chipAppendDelay = newValue;
        });
      };
    }
  }
docs: MDContactChips Directive Definition
  
  @param $mdTheming
  @param $mdUtil
  @returns {*}
  @ngInject