У меня похожая ситуация. Моя директива должна дождаться, когда сторонняя библиотека завершит некоторые манипуляции с DOM. Я использую функцию повтора для проверки каждые 50 миллисекунд, чтобы увидеть, существует ли еще элемент DOM, который мне нужен.
В директиве:
Utils.retry(function() { return !!$(selector)[0]; }, 50, 10).then(function() {
doSomethingInterestingWith($(selector));
});
Функция повтора (я определяю это в службе Utils):
var retry = function(fn, interval, maxTries) {
var result, deferred;
deferred = $q.defer();
// if we get a result, return it
result = fn();
if (result !== false) { deferred.resolve(result); }
else {
// if we've run out of tries, return false
if (maxTries) { maxTries -= 1; }
if (maxTries === 0) { deferred.reject('timed out'); }
// otherwise try again after interval
else {
$timeout(function() {
deferred.resolve(retry(fn, interval, maxTries));
}, interval);
}
}
return deferred.promise;
};
Utils.retry = retry;
ВИДЕТЬ plunk для рабочего примера.
Не могли бы вы уточнить, в какой части директивы? Директивы очень универсальны, поскольку вы можете изменять фазы компиляции/ссылки/контроллера, и ответ может зависеть от этого! –
Отличная картина, хотя может быть полезно опубликовать код из минимальной директивы, показывая, что нужно отложить. –