Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AngularJS document.ready doesn't work when using ng-view

Tags:

I have a problem with document.ready in angularJS when navigating between several routes in my app. It only works when I use ctrl+f5 (page reload); it seems navigating between pages does not change state of the document to ready.

Controller

  angular.element(document).ready(function() {     window.scrollTo(0,90); }); 

Main html file

<!DOCTYPE html > <html ng-app="myApp">     <head>         <meta http-equiv="content-type" content="text/html;charset=utf-8" />         <title></title>     </head>     <body>         <div class="container">             <div ng-view></div>         </div>     </body> </html> 

app file

var mainModule = angular.module('myApp', ['ui.bootstrap.dialog']); function viewServiceConfig($routeProvider) { $routeProvider.     when('/', {         controller: SomeController,         templateUrl: 'somehtml.html'     }).        when('/someroute', {         controller: SomeRouteController,         templateUrl: 'someroutehtml.html'     }).       otherwise({         redirectTo: '/'     }); }  mainModule.config(viewServiceConfig); 
like image 524
Soheil Ghahremani Avatar asked Jul 30 '13 11:07

Soheil Ghahremani


2 Answers

You can listen in your controllers defined in routes i.e. SomeController and SomeRouteController for $viewContentLoaded event. $viewContentLoaded is emitted every time the ngView content is reloaded and should provide similar functionality as the document.ready when routing in angularjs:

function SomeController($scope) {    $scope.$on('$viewContentLoaded', function() {window.scrollTo(0,90);}); } 

The document.ready is also triggered only once when you load your index.html. It is not triggered when the partial templates defined in your route configuration are loaded.

like image 66
davekr Avatar answered Oct 05 '22 22:10

davekr


Expanding on @davekr's answer, I found I need to add a $timeout to ensure the digest had complete and the html elements were available to query:

function SomeController($scope) {     $scope.$on('$viewContentLoaded', function() {         $timeout(function(){             //Do your stuff         });     }); } 

I tried many other events and this was the only way that worked reliably.

like image 33
Daniel Flippance Avatar answered Oct 05 '22 21:10

Daniel Flippance