How to trigger a method when Angular is done adding scope updates to the DOM?

前端 未结 6 667
余生分开走
余生分开走 2020-11-29 21:50

I am looking for a way to execute code when after I add changes to a $scope variable, in this case $scope.results. I need to do this in order to call some legacy code that r

6条回答
  •  日久生厌
    2020-11-29 22:12

    If you're like me, you'll notice that in many instances $timeout with a wait of 0 runs well before the DOM is truly stable and completely static. When I want the DOM to be stable, I want it to be stable gosh dang it. And so the solution I've come across is to set a watcher on the element (or as in the example below the entire document), for the "DOMSubtreeModified" event. Once I've waited 500 milliseconds and there have been no DOM changes, I broadcast an event like "domRendered".

    IE:

       //todo: Inject $rootScope and $window, 
    
    
       //Every call to $window.setTimeout will use this function
       var broadcast = function () {};
    
       if (document.addEventListener) {
    
           document.addEventListener("DOMSubtreeModified", function (e) {
               //If less than 500 milliseconds have passed, the previous broadcast will be cleared. 
               clearTimeout(broadcast)
               broadcast = $window.setTimeout(function () {
                   //This will only fire after 500 ms have passed with no changes
                   $rootScope.$broadcast('domRendered')
               }, 500)
    
           });
    
       //IE stupidity
       } else {
           document.attachEvent("DOMSubtreeModified", function (e) {
    
               clearTimeout(broadcast)
               broadcast = $window.setTimeout(function () {
                   $rootScope.$broadcast('domRendered')
               }, 500)
    
           });
       }
    

    This event can be hooked into, like all broadcasts, like so:

    $rootScope.$on("domRendered", function(){
       //do something
    })
    

提交回复
热议问题