Что "требует" объекта определения директивы?
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'
и, очевидно, неверно. Пожалуйста, скажи мне, что мне недостает в моем понимании.
Ответы
Ответ 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, если не найден.