Загружается событие AngularJs для вызова после содержимого

У меня есть функция, которую я хочу вызвать после загрузки содержимого страницы. Я читал о $viewContentLoaded, и это не работает для меня. Я ищу что-то вроде

document.addEventListener('DOMContentLoaded', function () { 
     //Content goes here 
}, false);

Выше вызов не работает для меня в контроллере AngularJs.

Ответ 1

Согласно документации $ viewContentLoaded, он должен работать

Испускается каждый раз, когда содержимое ngView перезагружается.

Событие $viewContentLoaded генерируется, что означает, что для получения этого события вам нужен родительский контроллер, такой как

<div ng-controller="MainCtrl">
  <div ng-view></div>
</div>

Из MainCtrl вы можете прослушать событие

  $scope.$on('$viewContentLoaded', function(){
    //Here your view content is fully loaded !!
  });

Проверьте демо

Ответ 2

Angular < 1.6.x

angular.element(document).ready(function () {
    console.log('page loading completed');
});

Angular >= 1.6.X

angular.element(function () {
    console.log('page loading completed');
});

Ответ 3

fixed - 2015.06.09

Используйте директиву и метод angular element ready следующим образом:

JS

.directive( 'elemReady', function( $parse ) {
   return {
       restrict: 'A',
       link: function( $scope, elem, attrs ) {    
          elem.ready(function(){
            $scope.$apply(function(){
                var func = $parse(attrs.elemReady);
                func($scope);
            })
          })
       }
    }
})

HTML

<div elem-ready="someMethod()"></div>

или для тех, кто использует синтаксис контроллера...

<div elem-ready="vm.someMethod()"></div>

Преимущество этого в том, что вы можете быть таким же широким или узким с вашим пользовательским интерфейсом, как вам нравится, и вы удаляете логику DOM с ваших контроллеров. Я бы сказал, что это рекомендуемый способ angular.

Вам может потребоваться определить приоритет этой директивы, если у вас есть другие директивы, работающие на одном и том же node.

Ответ 4

Вы можете напрямую вызвать его, добавив {{YourFunction()}} после элемента HTML.

Вот Plunker Link.

Ответ 5

Мне пришлось реализовать эту логику при работе с диаграммами Google. я сделал это в конце моего определения внутреннего контроллера html.

  <body>
         -- some html here -- 
--and at the end or where ever you want --
          <div ng-init="FunCall()"></div>
    </body>

и в этой функции просто вызовите вашу логику.

$scope.FunCall = function () {
        alert("Called");
}

Ответ 6

Вы можете вызвать версию события onload на javascript в формате js. это событие ng-load можно применить к любому элементу dom, например, div, span, body, iframe, img и т.д. Ниже приведена ссылка для добавления ng-load в существующий проект.

скачать ng-load для angular js

Ниже приведен пример для iframe: после загрузки testCallbackFunction будет вызываться в контроллере

Пример

JS

    // include the 'ngLoad' module
    var app = angular.module('myApp', ['ngLoad']);
    app.controller('myCtrl', function($scope) {
        $scope.testCallbackFunction = function() {
          //TODO : Things to do once Element is loaded
        };

    });  

HTML

  <div ng-app='myApp' ng-controller='myCtrl'> 
      <iframe src="test.html" ng-load callback="testCallbackFunction()">  
  </div>

Ответ 7

Если вы получаете ошибку $digest, которая уже выполняется, это может помочь:

return {
        restrict: 'A',
        link: function( $scope, elem, attrs ) {
            elem.ready(function(){

                if(!$scope.$$phase) {
                    $scope.$apply(function(){
                        var func = $parse(attrs.elemReady);
                        func($scope);
                    })
                }
                else {

                    var func = $parse(attrs.elemReady);
                    func($scope);
                }

            })
        }
    }

Ответ 8

var myM = angular.module('data-module');

myM.directive('myDirect',['$document', function( $document ){

    function link( scope , element , attrs ){

        element.ready( function(){

        } );

        scope.$on( '$viewContentLoaded' , function(){

            console.log(" ===> Called on View Load ") ;

        } );

    }

    return {
        link: link
    };

}] );

Выше метод работал у меня

Ответ 9

Запуск после загрузки страницы должен быть частично удовлетворен установкой прослушивателя событий на событие загрузки окна

window.addEventListener("load",function()...)

Внутри module.run(function()...) от angular у вас будет весь доступ к структуре модуля и зависимостям.

Вы можете broadcast и emit события для мостов связи.

Например:

  • модуль устанавливает событие onload и логику сборки
  • передать события вещания контроллерам, когда требуется логика Контроллеры
  • будут прослушивать и выполнять свою собственную логику, основанную на процессах загрузки модулей.

Ответ 10

Я использовал {{myFunction()}} в шаблоне, но затем нашел другой способ здесь, используя $timeout внутри контроллера. Думал, что я поделюсь им, отлично работает для меня.

angular.module('myApp').controller('myCtrl', ['$timeout',
function($timeout) {
var self = this;

self.controllerFunction = function () { alert('controller function');}

$timeout(function () {
    var vanillaFunction = function () { alert('vanilla function'); }();
    self.controllerFunction();
});

}]);

Ответ 11

Если вы хотите, чтобы определенный элемент полностью загрузился, используйте ng-init для этого элемента.

например. <div class="modal fade" id="modalFacultyInfo" role="dialog" ng-init="initModalFacultyInfo()"> ..</div>

в контроллере должна существовать функция initModalFacultyInfo().

Ответ 12

Я обнаружил, что если у вас есть вложенные представления - $viewContentLoaded запускается для каждого из вложенных представлений. Я создал это обходное решение, чтобы найти окончательный $viewContentLoaded. Кажется, что все в порядке для установки $window.prerenderReady в соответствии с требованиями Prerender (идет в .run() в главном app.js):

// Trigger $window.prerenderReady once page is stable
// Note that since we have nested views - $viewContentLoaded is fired multiple
// times and we need to go around this problem
var viewContentLoads = 0;
var checkReady = function(previousContentLoads) {
  var currentContentLoads = Number(viewContentLoads) + 0; // Create a local copy of the number of loads
  if (previousContentLoads === currentContentLoads) { // Check if we are in a steady state
    $window.prerenderReady = true; // Raise the flag saying we are ready
  } else {
    if ($window.prerenderReady || currentContentLoads > 20) return; // Runaway check
    $timeout(function() {checkReady(currentContentLoads);}, 100); // Wait 100ms and recheck
  }
};
$rootScope.$on('$stateChangeSuccess', function() {
  checkReady(-1); // Changed the state - ready to listen for end of render
});
$rootScope.$on('$viewContentLoaded', function() {
  viewContentLoads ++;
});

Ответ 13

var myTestApp = angular.module("myTestApp", []); 
myTestApp.controller("myTestController", function($scope, $window) {
$window.onload = function() {
 alert("is called on page load.");
};
});

Ответ 14

Решение, которое работает для меня, заключается в следующем

app.directive('onFinishRender', ['$timeout', '$parse', function ($timeout, $parse) {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            if (scope.$last === true) {
                $timeout(function () {
                    scope.$emit('ngRepeatFinished');
                    if (!!attr.onFinishRender) {
                        $parse(attr.onFinishRender)(scope);
                    }
                });
            }

            if (!!attr.onStartRender) {
                if (scope.$first === true) {
                    $timeout(function () {
                        scope.$emit('ngRepeatStarted');
                        if (!!attr.onStartRender) {
                            $parse(attr.onStartRender)(scope);
                        }
                    });
                }
            }
        }
    }
}]);

Код контроллера следующий

$scope.crearTooltip = function () {
     $('[data-toggle="popover"]').popover();
}

HTML-код следующий

<tr ng-repeat="item in $data" on-finish-render="crearTooltip()">

Ответ 15

Я использую setInterval, чтобы дождаться загрузки содержимого. Надеюсь, это поможет вам решить эту проблему.

var $audio = $('#audio');
var src = $audio.attr('src');
var a;
a = window.setInterval(function(){
    src = $audio.attr('src');
    if(src != undefined){
        window.clearInterval(a);
        $('audio').mediaelementplayer({
            audioWidth: '100%'
        });
    }
}, 0);