controller
Функция / объект представляет собой абстракцию модель-представление-контроллер (MVC). Хотя нет ничего нового, что можно написать о MVC, это все же самое значительное преимущество angular: разделить проблемы на более мелкие части. И это все, не более того, так что если вам нужно реагировать на Model
изменения, поступающие от человека, View
то Controller
это тот человек, который должен выполнять эту работу.
История о link
функции отличается, она идет с другой точки зрения, чем MVC. И это действительно важно, когда мы хотим пересечь границы controller/model/view
(шаблона) .
Давайте начнем с параметров, которые передаются в link
функцию:
function link(scope, element, attrs) {
- область действия - это угловой объект области видимости.
- element - это элемент jqLite-wrapped, которому соответствует эта директива.
- attrs - это объект с нормализованными именами атрибутов и их соответствующими значениями.
Чтобы поместить link
в контекст, мы должны упомянуть, что все директивы проходят через эти шаги процесса инициализации: Compile , Link . Выдержка из книги Брэда Грина и Шьяма Сешадри Angular JS :
Фаза компиляции (родственная ссылка, давайте упомянем ее здесь, чтобы получить ясную картину):
На этом этапе Angular обходит DOM, чтобы определить все зарегистрированные директивы в шаблоне. Затем для каждой директивы она преобразует DOM на основе правил директивы (template, replace, transclude и т. Д.) И вызывает функцию compile, если она существует. Результатом является скомпилированная функция шаблона,
Фаза связи :
Чтобы сделать представление динамическим, Angular затем запускает функцию связи для каждой директивы. Функции связи обычно создают прослушиватели в DOM или модели. Эти слушатели постоянно синхронизируют вид и модель.
Хороший пример того, как использовать link
можно найти здесь: Создание пользовательских директив . См. Пример: создание директивы, управляющей DOM , которая вставляет «дату-время» в страницу, обновляемую каждую секунду.
Просто очень короткий фрагмент из этого богатого источника выше, демонстрирующий реальные манипуляции с DOM. Функция $ timeout подключена, а также очищается при вызове деструктора, чтобы избежать утечек памяти
.directive('myCurrentTime', function($timeout, dateFilter) {
function link(scope, element, attrs) {
...
// the not MVC job must be done
function updateTime() {
element.text(dateFilter(new Date(), format)); // here we are manipulating the DOM
}
function scheduleUpdate() {
// save the timeoutId for canceling
timeoutId = $timeout(function() {
updateTime(); // update DOM
scheduleUpdate(); // schedule the next update
}, 1000);
}
element.on('$destroy', function() {
$timeout.cancel(timeoutId);
});
...
$watch
,$digest
и$apply
. »?