2015-02-24 3 views
1

У меня есть простая директива вдоль этих линий:розжиг угловой Js анимации в директиве

angular.module('application').directive('sdTitle', sdTitleDirective); 
 

 
sdTitleDirective.$inject = ['$animate']; 
 
function sdTitleDirective($animate) { 
 
    var directive = { 
 
    template: '<div class="title-container">some content</div>', 
 
    link: link, 
 
    replace: true 
 
    }; 
 

 
    return directive; 
 

 
    function link(scope, element, attrs) { 
 
    element.bind("click", function() { 
 
     $animate.leave(element); 
 
    }); 
 
    } 
 
}

И анимация, подобной этой:

angular.module('application').animation('.title-container', titleAnimation); 
 
function titleAnimation() { 
 
    return { 
 
    leave: leaveAnimation 
 
    }; 
 

 
    function leaveAnimation(element, done) { 
 
    console.log('animate leave', element); 
 
    element.hide().fadeOut(800, done); 
 
    } 
 

 
}

Кажется, я не могу заставить leaveAnimation фактически срабатывать при нажатии элемента директивы. Мне, должно быть, что-то не хватает, как работает $ animate или как анимация javascript вызывается, но я в недоумении.

Как правильно использовать методы анимации $ animate службы в директиве и с анимацией javascript, а не с CSS3?

ответ

0

обработчиков событий DOM, приложенных к примеру addEventListener() или методы jqLite/JQuery bind и on выполняются вне текущего углового контекста и не будут вызывать цикл Digest.

Вам придется сделать это вручную, используя, например, $apply:

$ применяются() используется для выполнения выражения в угловой из-за пределов угловой рамочным. (Например, из событий браузера DOM, setTimeout, XHR или сторонних библиотек). Поскольку мы вызываем в угловой каркас, нам необходимо выполнить правильный жизненный цикл обработки исключений, выполняющих часы.

Пример:

element.bind("click", function() { 
    scope.$apply(function() { 
    $animate.leave(element); 
    }); 
}); 

Демо:http://plnkr.co/edit/OepqBsCW25Lf2qCenbtK?p=preview

Это не видно из вашего публикуемую кода, если у вас нет, но вы должны использовать модуль ngAnimate.

Обратите внимание, что в демо-версии я тоже изменился:

element.hide().fadeOut(800, done); 

To:

element.fadeOut(800, done); 
+0

Спасибо! Это определенно решает проблему контекста и отвечает на вышеупомянутый вопрос, хотя я борюсь с этой модифицированной версией, где я тоже пытаюсь оживить элемент. Функция enterAnimation никогда не вызывает вызов. Кроме того, я не уверен, почему обратные вызовы done() не выполняются. Я не вижу их в документальных сигнатурах метода для $ animate.enter и $ animate.leave. "введите (элемент, parentElement, afterElement, [options]);" "оставить (элемент, [опции]);" http://plnkr.co/edit/trCJyv1wuMNNTsyics1p?p=preview – Stefan

+0

Добро пожаловать :) У меня нет времени прямо сейчас, но я помогу вам через час или два. – tasseKATT

+0

Вот плункер с комментариями: http://plnkr.co/edit/ZxrCRjLLzzCelI3JNCie?p=preview – tasseKATT

Смежные вопросы