javascript — Разница между функциями ‘controller’, ‘link’ и ‘compile’ при определении директивы

Разница между функциями ‘controller’, ‘link’ и ‘compile’ при определении директивы

Я собираюсь немного расширить ваш вопрос, а также включить функцию компиляции.

  • функция компиляции — используется для манипулирования DOM шаблона (т. е. манипуляции с элементом tElement = template), следовательно, манипуляции, которые применяются ко всем клонам DOM шаблона, связанным с директивой. (Если вам также нужна функция ссылки (или функции ссылки до и после), и вы определили функцию компиляции, функция компиляции должна возвращать функцию (и) 'link' потому что атрибут 'link' игнорируется, если атрибут 'compile' имеет значение определены.)

  • Функция Link — обычно используется для регистрации обратных вызовов слушателей (т. е. выражений $watch в области видимости), а также для обновления DOM (т. е. манипулирования iElement = индивидуальный элемент экземпляра). Это выполняется после того, как шаблон был клонирован. Например, внутри <li ng-repeat...> функция ссылки выполняется после того, как шаблон <li> (tElement) был клонирован (в iElement) для этого конкретного элемента <li> . $watch позволяет директиве получать уведомления об изменениях свойства области (область действия связана с каждым экземпляром), что позволяет директиве отображать обновленное значение экземпляра в DOM.

  • функция контроллера — должна использоваться, когда другая директива должна взаимодействовать с этой директивой. Например, на домашней странице AngularJS директива pane должна добавить себя в область, поддерживаемую директивой tabs, следовательно, директива tabs должна определить метод контроллера (думаю API), к которому директива pane может обращаться / вызывать.

    Для более подробного объяснения директив tabs и pane, а также того, почему директива tabs создает функцию на своем контроллере с использованием this (а не на $scope ), смотрите раздел «this» против $ scope в контроллерах AngularJS .

  • В общем случае вы можете помещать методы, $watches и т. Д. Либо в контроллер директивы, либо в функцию link. Сначала будет запущен контроллер, что иногда имеет значение (см. Эту скрипку, которая регистрирует, когда функции ctrl и link запускаются с двумя вложенными директивами). Как упоминал Джош в комментарии , вы можете захотеть поместить функции манипулирования областью в контроллер просто для согласованности с остальной частью фреймворка.

    Понравилась статья? Поделиться с друзьями:
    JavaScript & TypeScript
    Adblock
    detector