Запустить код директивы после ng-src

0

У меня есть директива видеопроигрывателя, в которой используется шаблон 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, поэтому почему они являются даже отдельными функциями?

  • 0
    link: function , link: {pre: function, post: function} , все функции оцениваются перед дочерними директивами.
  • 0
    сам тэг video вызывает несколько событий, может ли Angular их увидеть?
Теги:

2 ответа

1

У вас может быть $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
       }
   });
}
  • 0
    Атрибут отсутствует в корневом элементе директивы и не требует постоянного обновления.
  • 1
    @TahsisClaus, вы можете отменить регистрацию этого $observe только у вас появится ценность. Не могли бы вы добавить свой HTML в свой вопрос?
Показать ещё 2 комментария
0

Существует несколько рецептов для выполнения кода в link в тот момент, когда существует директива DOM '. Один использует тайм-аут с нулевой задержкой

$timeout(function () {
  ...
});

Обычно это предпочтительнее, если вы после визуализации DOM или интерполированных значений. Это не вариант здесь, потому что templateUrl используется и директива шаблон загружается асинхронно, а шаблон не доступен во время стадии компоновки.

В другом рецепте используются наблюдатели за наблюдателями/наблюдателями атрибутов (одноразовые, если вам не нужны привязки данных).

var unobserveNgSrc = attrs.$observe('ngSrc', function (ngSrc, oldNgSrc) {
  if (!ngSrc) return;
  unobserveNgSrc();
  ...
})

Он выполняется сразу после функции prelink, поэтому почему они являются даже отдельными функциями?

Такое поведение подсказывает, для чего его можно использовать. В родительском preLink можно сделать некоторые вещи, которые должны предшествовать дочернему preLink или последнему можно извлечь выгоду, что вы редко найдете полезным для простых директив. И parent postLink выполняет последний, и что хороший момент для "хорошо, все мои дети уже скомпилированы и связаны, пусть что-то наконец".

  • 0
    Я не хочу делать это асинхронно, потому что всегда лучше избегать этого, когда это возможно в Angular. Весь смысл функций post link состоит в том, чтобы выполнять после того, как дочерние директивы были связаны, по крайней мере, когда вы используете template, а не templateUrl, о котором вы упомянули, и они НЕ делают этого.
  • 0
    Вы могли бы вернуть свои деньги, если бы это было правдой :) Ваше заблуждение происходит из-за неправильного понимания, что такое ссылка. Из руководства : «Ссылка означает настройку слушателей на DOM и настройку $ watch на Scope, чтобы синхронизировать их. ». Это не означает, что привязки областей уже были интерполированы в postLink. Потому что они этого не сделали. Они интерполируются сразу после postLink, когда цикл дайджеста начинается, а затем устанавливается. И это цель $ timeout (...), код будет выполнен сразу после следующего дайджеста.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню