У меня есть директива видеопроигрывателя, в которой используется шаблон ng-src. Как запустить код директивы после того, как ng-src был оценен, чтобы загрузить видео?
Вот код директивы:
return {
restrict: 'A',
replace: false,
transclude: false,
scope: true,
templateUrl: "/modules/didyouknow/views/slideshow-frame.directive.client.view.html",
link: {
pre: function() {
console.log('a');
},
post: function(scope, element, attrs) {
/**
* scope.frame - frame information
*/
scope.frame = scope[attrs.slideshowFrame];
}
}
};
обе функции ссылок выполняются до того, как {{expr}}
был оценен в шаблоне.
Весь смысл почтовой ссылки заключается в том, что он выполнялся после дочерних ссылок, в обратном порядке как предварительные ссылки. Так почему же это не последнее? Он выполняется сразу после функции prelink, поэтому почему они являются даже отдельными функциями?
У вас может быть $observe
внутри вашей директивы, которая будет работать так же, как и у $watch
но разница в том, что она вычисляет выражение {{}}
интерполяции.
Внутри $observe
вы можете увидеть, имеет ли значение ng-src
единственный вызов метода директивы. иначе подождите.
link: function(scope, element, attrs){
attrs.$observe('ngSrc', function(newVal, oldVal){
if(newValue){
//call desired code when 'ng-src' have value
}
});
}
$observe
только у вас появится ценность. Не могли бы вы добавить свой HTML в свой вопрос?
Существует несколько рецептов для выполнения кода в link
в тот момент, когда существует директива DOM '. Один использует тайм-аут с нулевой задержкой
$timeout(function () {
...
});
Обычно это предпочтительнее, если вы после визуализации DOM или интерполированных значений. Это не вариант здесь, потому что templateUrl
используется и директива шаблон загружается асинхронно, а шаблон не доступен во время стадии компоновки.
В другом рецепте используются наблюдатели за наблюдателями/наблюдателями атрибутов (одноразовые, если вам не нужны привязки данных).
var unobserveNgSrc = attrs.$observe('ngSrc', function (ngSrc, oldNgSrc) {
if (!ngSrc) return;
unobserveNgSrc();
...
})
Он выполняется сразу после функции prelink, поэтому почему они являются даже отдельными функциями?
Такое поведение подсказывает, для чего его можно использовать. В родительском preLink
можно сделать некоторые вещи, которые должны предшествовать дочернему preLink
или последнему можно извлечь выгоду, что вы редко найдете полезным для простых директив. И parent postLink
выполняет последний, и что хороший момент для "хорошо, все мои дети уже скомпилированы и связаны, пусть что-то наконец".
link: function
,link: {pre: function, post: function}
, все функции оцениваются перед дочерними директивами.