2014-10-28 2 views
-1

Я стараюсь, чтобы мой угловой проект был как можно более модульным. В настоящее время у меня есть 3 вложенных директивы, которые составляют основу моего проекта.Унаследованные директивы в угловом

В самой нижней директиве всегда будут одинаковые функциональные возможности ядра и объекты области видимости, но в зависимости от варианта использования потребуются дополнительные объекты и функции области видимости. Приложение очень велико, поэтому важно, чтобы все как можно более развязанное было важно, а также следовать принципу DRY.

В OOP в стиле python я бы просто наследовал все свойства и функции, а затем добавил к ним. Есть что-то подобное в Angular?

Для примера:

Основания

myApp.directive('itemOption', function() { 
    return { 
     restrict: 'E', 
     templateUrl: "item_option.html", 
     scope: { 
      'lowest': '=', 
      'middle': '=', 
      'high': '=', 
      'ngModel': '=', 
     }, 
     controller: function ($scope) { 
      $scope.prop1 = "Default 1" 
      $scope.prop2 = "Default 2" 
     } 
    } 
} 

повторяющейся директивы, которая будет использоваться вместо основания

myApp.directive('itemOptionVariation1', function() { 
    return { 
     restrict: 'E', 
     templateUrl: "item_option.html", 
     scope: { 
      'lowest': '=', 
      'middle': '=', 
      'high': '=', 
      'ngModel': '=', 
     }, 
     controller: function ($scope) { 
      $scope.prop1 = "Default 1" 
      $scope.prop2 = "Default 2" 

      // Unique to this directive 
      $scope.prop900 = "Penguins" 
     } 
    } 
} 

И Другого

myApp.directive('itemOptionVariation2', function() { 
    return { 
     restrict: 'E', 
     templateUrl: "item_option.html", 
     scope: { 
      'lowest': '=', 
      'middle': '=', 
      'high': '=', 
      'ngModel': '=', 
     }, 
     controller: function ($scope) { 
      $scope.prop1 = "Default 1" 
      $scope.prop2 = "Default 2" 

      // Unique to this directive 
      $scope.prop3 = "This is awesome" 
     } 
    } 
} 

ответ

2

Вы можете использовать требуют: [^ parent_directive1,^parent_directive2] как атрибут директивы. Пожалуйста, проверьте приведенный ниже пример.

myApp.directive('itemOptionVariation2', function() { 
    return { 
     restrict: 'E', 
     templateUrl: "item_option.html", 
     require: ['^itemOption', '^itemOptionVariation1'], 

Это не совсем наследство, а композиция. Однако это решило мои потребности.

+0

Я вижу, что это хорошее решение. Можете ли вы объяснить, что вы подразумеваете под композицией, а не наследованием? Я знаю, что это решает проблему, я просто испытываю проблемы, всегда видя, почему. – Kazanz

+0

Это мое понимание, а не наследование на Java, в Angular вы должны определить унаследованные свойства и контроллеры. Обратитесь к этому разговору и плункеру, который дает более подробную информацию о реализации. http://plnkr.co/edit/djNk8PPzXvngZOvAirMu?p=preview http://stackoverflow.com/questions/19111696/scope-inheritance-for-angular-directives – Aviro

+1

Спасибо @Aviro. Вот мое решение, наследующее контроллеры вне директивы. https://gist.github.com/Kazanz/379c1dd5507d15ec7977 – Kazanz

Смежные вопросы