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

Вопросительный знак в директиве Требовать

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

app.directive("contenteditable", function() {
    return {
        restrict: "A",
        require: "ngModel",
        /* etc. */

Это не удалось загрузить:

Контроллер 'ngModel', требуемый директивой 'contenteditable', не может быть найден!

Посмотрев аналогичный код в документах angular, я изменил строку require:

require: "?ngModel"

Теперь он отлично работает. Я предполагаю, что ? делает это необязательным, но это не имеет большого значения для меня. Что делает знак вопроса и (если это не очевидно), почему он позволяет директиве работать?

4b9b3361

Ответ 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, но на самом деле это не требуется.