Подтвердить что ты не робот

Что "требует" объекта определения директивы?

require - Требовать, чтобы другой контроллер был передан в текущую директиву функция связывания. Требование принимает имя управляющего контроллера для перехода. Если такой контроллер не найден, возникает ошибка. Имя может иметь префикс:

  • ? - Не поднимайте ошибку. Это делает необязательной зависимость.
  • ^ - Ищите контроллер на родительских элементах.

Вышеизложенное определение из официальных документов. Неопределенность здесь заключается в том, что именно является "директивным контроллером".

В качестве примера возьмем вкладку директивы из проекта angularjs-ui bootstrap.

angular.module('ui.bootstrap.tabs', [])
.controller('TabsController', ['$scope', '$element', function($scope, $element) {
  ... // omitted for simplicity
}])
.directive('tabs', function() {
  return {
    restrict: 'EA',
    transclude: true,
    scope: {},
    controller: 'TabsController',
    templateUrl: 'template/tabs/tabs.html',
    replace: true
  };
})
.directive('pane', ['$parse', function($parse) {
  return {
    require: '^tabs',
    restrict: 'EA',
    transclude: true,
    scope:{
      heading:'@'
    },
    link: function(scope, element, attrs, tabsCtrl) {
      ... // omitted for simplicity
    },
    templateUrl: 'template/tabs/pane.html',
    replace: true
  };
}]);

Директива pane имеет require: '^tabs', в которой tabs - это имя директивы на ее родительском элементе, а имя контроллера, прикрепленного к этой директиве, TabsController. Из моей собственной интерпретации вышеприведенного определения это должно быть require: '^TabsController' not require: '^tabs' и, очевидно, неверно. Пожалуйста, скажи мне, что мне недостает в моем понимании.

4b9b3361

Ответ 1

Эта конкретная тема документации действительно запутанна, но как ни странно, как кажется, все это имеет смысл.

Ключом к пониманию логики этого определения является понимание того, что "директивный контроллер" относится к директивному экземпляру контроллера, а не к контроллеру factory.

После примера вкладок, когда создается элемент tabs, создается и создается новый экземпляр TabsController и прикрепляется к данным конкретного элемента, например:

tabElement.data('$tabsController', tabsControllerInstance)

Элемент require: '^tabs' в элементе pane в основном является запросом для этого конкретного экземпляра контроллера (tabsControllerInstance), используемого в родительском элементе tabs.

Ответ 2

Параметр require, включая его префиксы, задокументирован на странице ссылок $compile API.

Требовать другую директиву и ввести свой контроллер в качестве четвертого аргумента функции связывания. Требование принимает строковое имя (или массив строк) директивы (ов) для передачи. Если используется массив, введенный аргумент будет массивом в соответствующем порядке. Если такая директива не найдена, или если директива не имеет контроллера, то возникает ошибка. Имя может иметь префикс:

  • (без префикса). Найдите требуемый контроллер для текущего элемента. Выброс ошибки, если не найден.
  • ? - Попытайтесь найти требуемый контроллер или передать null в link fn, если не найден.
  • ^ - Найдите необходимый контроллер, выполнив поиск элемента и его родителей. Выброс ошибки, если не найден.
  • ^^ - Найдите требуемый контроллер, выполнив поиск родительских элементов. Выброс ошибки, если не найден.
  • ?^ - Попытайтесь найти необходимый контроллер, выполнив поиск элемента и его родителей или пройдя null в link fn, если не найден.
  • ?^^ - Попытайтесь найти требуемый контроллер, выполнив поиск родительских элементов или пройдите null в link fn, если не найден.