Angular - создать несколько директив из одной и той же функции

Чтобы создать директиву/контроллер/фабрику, вы предоставляете функцию, служащую «точкой инъекции»:

angular.module('myApp').directive('myDirective', ['dependencies', function injectionPoint(dependencies) {}]);

Можете ли вы предоставить это injectionPoint через другую функцию, зарегистрированную в Angular? например factory? Я должен отметить, что я объявил все в отдельных файлах, и я пытаюсь сделать это «угловым способом» и не создавать ненужные глобальные переменные.

В частности, у меня есть две директивы ввода, которые в основном одинаковы, только с разными шаблонами и изолированным объявлением области.

Я думал создать «фабрику директив», которую я мог бы использовать, например:

function directiveFactory(scopeOverride, extraInit) {
    return function directiveInjectionPoint(depedencies) {
        return { restrict...,
                 template...,
                 scope: angular.extend({/*defaults*/}, scopeOverride),
                 link: function(...) {
                           // default stuff
                           if(angular.isDefined(extraInit)) extraInit($scope, el, attrs);
                       }
    }
}

который я бы тогда использовал как:

angular.module('myApp')
    .directive('myDirective1', directiveFactory({/* new stuff */))
    .directive('myDirective2', directiveFactory({/* other stuff */, fn2...));

Но как мне зарегистрировать эту функцию в Angular, а затем использовать ее в объявлении директивы?


person drzaus    schedule 18.08.2014    source источник


Ответы (1)


Вы можете использовать службу и директивы следующим образом:

app.factory('MyService', function() {

  var MyService = {};

  MyService.createDirective = function(scopeOverride, extraInit) {
    return {
      restrict: 'E',
      transclude: true,
      scope: scopeOverride,
      template: '<pre ng-transclude></pre>'
    };
  };

  return MyService;

});


app.directive('drzausDirective1', function(MyService) {
  return MyService.createDirective(true);
});


app.directive('drzausDirective2', function(MyService) {
  return MyService.createDirective(false);
});

http://plnkr.co/edit/BuKMXxMQ4XVlsykfrDlk?p=preview

введите здесь описание изображения

person Jossef Harush    schedule 18.08.2014
comment
Потрясающий. И хитрость для меня заключалась в использовании соответствующих инъекций — только factory требовались зависимости (такие как константы, $http и т. д.), а сами директивы нуждались только в factory. - person drzaus; 19.08.2014