У меня есть директива Angular, которая устанавливает высоту элемента, равную внутренней высоте окна браузера (+/- заданное смещение). Эта директива реагирует на событие "изменить размер" окна и соответственно регулирует его высоту. Когда масштаб моей директивы испускает событие "$ destory", я удаляю привязку к событию "изменить размер" (я думаю, что оставить его на месте вызовет некоторые проблемы, исправьте меня, если я ошибаюсь).
Я не знаю, как сделать этот отряд событий "безопасным" способом. Что делать, если у меня есть несколько экземпляров этой директивы в моем приложении, и что, если у меня есть другие директивы, которые присоединяются к событию "изменить размер" ?
JQuery имеет концепцию пространства имен событий, которое кажется хорошим решением, но реализация Angular (JQLite) не поддерживает это. Я бы предпочел не использовать JQuery, поскольку я уже использую Angular, так что мне делать?
Здесь код для моей директивы, как сегодня
window.angular.module('arcFillClient', [])
.directive('arcFillClientY', ['$window',
function ($window) {
function link($scope, el, attrs) {
var setHeight,
onResize,
cleanUp;
setHeight = function (offSetY) {
var newHeight;
offSetY = offSetY || 0;
newHeight = Math.max($window.innerHeight + parseInt(offSetY, 10)) + 'px';
el.height(newHeight);
};
onResize = function () {
var offset;
offset = attrs.arcFillClientY || 0;
setHeight(offset);
};
attrs.$observe('arcFillClientY', setHeight);
window.angular.element($window).on('resize', onResize);
cleanUp = function () {
window.angular.element($window).off('resize');
};
$scope.$on('$destroy', cleanUp);
}
return {
link: link
};
UPDATE Похоже на случай RTFM, но на всякий случай кто-то еще блуждает здесь, вот еще информация. Передача исходной функции (в моем случае OnResize
) в .off()
работает, чтобы изолировать область действия функции .off()
. Из docs:
Обработчик также можно удалить, указав имя функции в аргументе обработчика. Когда jQuery {ahem... JQLite} присоединяет обработчик событий, он присваивает уникальный идентификатор функции обработчика.
Здесь обновленная функция cleanUp
из моей директивы:
cleanUp = function () {
window.angular.element($window).off('resize', onResize);
};
Спасибо tasseKATT, Karolis и Hans за ваши вклады.