Search code examples
javascriptangularjsangularjs-routing

angularjs: getting route resolved data outside template


On loading '/', I am getting 'content' and 'sidebar'using 'myService' and resolve option in route provider and I can render the 'content' to the template ($scope.contents = content;).

But $scope.sideBar = sideBar; is not working. This is because sideBar is outside the template ?

How can I render sidebar items on loading '/' ? Is it possible to pass this data (sidebar) to the indexCtrl?

app.js

var myApp = angular.module("MyApp", ['ngRoute']);

myApp.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      when('/', {
        templateUrl: 'contents.html',
        controller: 'Myctrl',
        resolve: {
            content: function(myService){
                return myService.getContent();
            },
            sideBar: function(myService){
                return myService.getSideBar();            
            }    
          }           
      }).
      otherwise({
        redirectTo: '/'
      });
}]);


myApp.controller('Myctrl', function (content, sideBar, $scope) {    
    $scope.contents = content;
    $scope.sideBar = sideBar;
});

myApp.controller('indexCtrl', function($scope) { 


});


myApp.service("myService", function () {     
    this.getContent = function () {
       return 'Main contents';
    }    

    this.getSideBar = function () {
       return 'side bar'    
    }    
});

index.html

<div ng-app="MyApp" ng-controller="indexCtrl">

            <div class="sidebar">
                {{sideBar}}
            </div>        

            </div>
            <div class="main">                      
                    <div ng-view></div> 
            </div> 
</div>

contents.html

<div>{{contents}}</div>

Solution

  • You can inject your myService into your indexCtrl and access the function getSideBar like this

    myApp.controller('indexCtrl', function($scope, myService) { 
    
     $scope.sideBar = myService.getSideBar();
    });
    

    this will get the string from your getSideBar function when your indexCtrl is first initialized. If you do this:

    myApp.controller('indexCtrl', function($scope, myService) { 
    
     $scope.sideBar = myService.getSideBar;
    });
    

    and inside index.html:

     <div class="sidebar">
         {{sideBar()}}
     </div>  
    

    The string will update when the data in your service updates.