Вопросительный знак в директиве Требовать
Я следил за учебником, пытающимся получить директиву для работы, которая требовала ngModel
:
app.directive("contenteditable", function() {
return {
restrict: "A",
require: "ngModel",
/* etc. */
Это не удалось загрузить:
Контроллер 'ngModel', требуемый директивой 'contenteditable', не может быть найден!
Посмотрев аналогичный код в документах angular, я изменил строку require
:
require: "?ngModel"
Теперь он отлично работает. Я предполагаю, что ?
делает это необязательным, но это не имеет большого значения для меня. Что делает знак вопроса и (если это не очевидно), почему он позволяет директиве работать?
Ответы
Ответ 1
Это именно то, что вы догадались: ?
делает директиву необязательной.
В основном, они находятся в вашем распоряжении при определении директивных требований:
-
someDirective
: require someDirective на том же элементе и передать его функции связи
-
?someDirective
: передать someDirective-контроллер, если он доступен для одного элемента для связывания функции. Если нет, пропустите null.
-
^someDirective
: require someDirective на одном из родительских элементов и передать его функции связывания.
-
?^someDirective
: передать someDirective-контроллер, если он доступен на одном из родительских элементов для связывания функции. Если нет, пропустите null.
Если ваша директива требует нескольких других директив, вы можете использовать одну и ту же вещь, но передать такой массив:
require: ['firstRequiredDirective', '^secondRequiredDirective']
На этот раз вы получите массив необходимых директивных контроллеров, переданных вашей функции связывания.
В вашем случае, если элемент, имеющий директиву contenteditable
имеет ngModel
, ngModelController, будет передан вашей функции связывания.
Если на нем нет директивы ngModel
, она пройдет null
.
Ответ 2
Просто добавьте более подробную информацию для @Igor Pantovic ответ о префиксе ^
из AngularJS $compile guide:
-
(без префикса). Найдите требуемый контроллер для текущего элемента. Выброс ошибки, если не найден.
-
? - Попытайтесь найти нужный контроллер или передать null в ссылку fn, если не нашли.
- ^ - Найдите требуемый контроллер, выполнив поиск элемента и его родителей. Выброс ошибки, если не найден.
- ^^ - Найдите требуемый контроллер, выполнив поиск родительских элементов. Выброс ошибки, если не найден.
- ? ^ - Попытайтесь найти требуемый контроллер, выполнив поиск элемента и его родителей или передав null в ссылку fn, если не найден.
- ? ^^ - Попытайтесь найти требуемый контроллер, выполнив поиск родительских элементов или передайте null в ссылку fn, если не нашли.
Ответ 3
Вы правы, что ?
делает необязательную директиву необязательной. Это означает, что значение null будет возвращено в функции ссылки директивы для этого требования. Способ, которым вы его используете, указывает, что ngModel
может быть на том же элементе, что и contenteditable
, но на самом деле это не требуется.