Как передать ngFocus/ngBlur директивному шаблону <input>?

Я пытаюсь создать настраиваемый компонент (директива), состоящий из окна <input> и кнопок [-] и [+]. В настоящее время приведенный ниже пример реализует только поле ввода.

Итак, скажем, у меня есть следующий HTML-код для моей директивы:

<my-input ng-blur="onBlur($event)" ng-focus="onFocus($event)"></my-input>

И для целей тестирования я использую этот код:

app.run(function ($rootScope) {
  $rootScope.onBlur = function ($event) {
    console.log('onBlur', $event);
  };

  $rootScope.onFocus = function ($event) {
    console.log('onFocus', $event);
  };
});

Теперь я хочу создать свою настраиваемую директиву <my-input>, которая имеет поле <input> в шаблоне, и мне нужно установить ng-blur и ng-focus на <my-input>, чтобы отвечать на события размытия/фокусировки на входе коробка.

У меня есть почти следующее решение: http://codepen.io/anon/pen/KpELmj

1) У меня такое чувство, что этого можно добиться гораздо лучше, я просто не могу это сделать. Мысли?

2) $event кажется undefined, и я не могу понять, почему. Мысли?

Ответ 1

Хорошо понял. Ответ Дорона был хорошей отправной точкой для исследований, но теперь я думаю, что у меня есть то, что вы ищете. Ключ в том, что вам нужно использовать & в разделе ссылки, чтобы заставить его выполнить выражение.

.directive('myInput', function($timeout) {
    return {
        restrict: 'E',
        scope: {
            data: '=',
            blur: '&myBlur' //this is the key line
        },
        template: '<input ng-blur="blur($event)" ng-model="data">'
    }
})

Вот как вы его используете:

<my-input my-blur="runBlurFunc()"></my-input>

Если вы действительно хотите определить функцию в области корня, вы можете использовать $scope.$root.onBlur() вместо runBlurFunc()

Ответ 2

Надеюсь, я правильно ответил на ваш вопрос, попытался ли использовать функцию ссылки?

app.directive('myInput', function () {
  return {
    restrict: 'E',
    scope: {
      ngBlur: '&',
      ngFocus: '&'
    },
    bindToController: true,
    controller: controllerFn,
    controllerAs: 'ctrl',
    link:function(scope){

      scope.onBlur = function(ev){
        console.log(ev);
      }

      scope.onFocus = function(ev){
       console.log(ev);
     }

   },

   template: '[-]<input ng-blur="onBlur($event)" ng-focus="onFocus($event)"></input>[+]'
 }
});