Edit in JSFiddle

(function(window, jQuery, angular) {
  'use strict';
  
  var module = angular.module('App', []);
  
  module.controller('Sample', [
    '$scope',
    function($scope) {
      $scope.Sample = this;
      
      this.selectValue = '1';
    
      this.onOpened = function() {
        window.console.log('おーぷん');
      };
      
      this.onClosed = function() {
        window.console.log('しまった');
      };
      
      this.onChanged = function() {
        window.console.log('変わった');
      };
      
      this.onNonChanged = function() {
        window.console.log('変わってない');
      };
    }
  ]);
  
  /**
   * 普通のselect要素では、「リストボックスが開かれた」、「リストボックスが閉じた」、
   * 「値が変わらなかった」等のイベントが無いため作成
   * 
   * 以下のイベントを発生させる
   *   ・リストボックスが開かれた
   *   ・リストボックスが閉じた
   *   ・値が変わらなかった
   */
  module.directive('ngSelectEvent', [
    '$timeout',
    function($timeout) {
      return {
        restrict: 'A',
        scope: {
          expanded: '&',
          unexpanded: '&',
          nonchanged: '&'
        },
        link: function(scope, element, atts, ctrl) {
          var jQueryElement = jQuery(element);
          
          var WATCH_EXPAND_EVENTS = 'click';
          var WATCH_UNEXPAND_EVENTS = 'click blur keyup';
          
          jQueryElement.data('expanded', false);

          var __expanding = function() {
            jQueryElement.off(WATCH_EXPAND_EVENTS, __expanding);
            jQueryElement.data('expanded', true);
            jQueryElement.data('oldvalue', jQueryElement.val());
            jQueryElement.on(WATCH_UNEXPAND_EVENTS, __unexpanding);

            (scope.expanded)();
          };

          var __unexpanding = function() {
            jQueryElement.off(WATCH_UNEXPAND_EVENTS, __unexpanding);
            jQueryElement.data('expanded', false);
            jQueryElement.on(WATCH_EXPAND_EVENTS, __expanding);

            (scope.unexpanded)();
            
            var oldValue = jQueryElement.data('oldvalue');
            $timeout(function() {
              var newValue = jQueryElement.val();
              if (oldValue == newValue) {
                (scope.nonchanged)();
              }
            }, 0);
          };

          jQueryElement.on(WATCH_EXPAND_EVENTS, __expanding);
        }
      };
    }
  ]);
  
})(window, window.jQuery, window.angular);
<div ng-app="App" ng-controller="Sample">
  <select ng-model="Sample.selectValue" ng-select-event expanded="Sample.onOpened()" unexpanded="Sample.onClosed()"  nonchanged="Sample.onNonChanged()" ng-change="Sample.onChanged()">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
  </select>
  {{Sample.selectValue}}
</div>