Search code examples
javascriptangularjsangular-ui-routeroclazyload

AngularJS - How do I get the state name inside of state resolve function to load controller files?


I am making head ways into diving into my first complete AngularJS app using PHP and tailored toward an api-centric approach.

I have reached this point:

I want to be able to capture the state name inside $stateProvider below for purpose of passing to load function. However I am unable to get $rootScope.statename to be anything but undefined. I have removed this from my solution because I could not get it to help remove undefined from the load function alert statement.

How do I capture (risk or actionitem) as the desired state name to be able to pass to the load function?

app.js -Removed code snippet

app.run( ['$rootScope', '$state', '$stateParams',
                      function ($rootScope,   $state,   $stateParams) {
                           $rootScope.statename = $state.current; 
}]);

app.js

angular.module('Action', ['datatables', 'datatables.scroller', 'ngResource']);          
angular.module('Risk',   ['datatables', 'datatables.scroller', 'ngResource']);          

var app = angular.module('Main', ['ui.router', 'oc.lazyLoad', 'datatables', 'ngResource', 'Action', 'Risk']);

app.config(['$ocLazyLoadProvider', '$stateProvider', '$urlRouterProvider', function($ocLazyLoadProvider, $stateProvider, $urlRouterProvider){
    configRoutes($stateProvider, $urlRouterProvider, $ocLazyLoadProvider);
}]);

route-config.js

function load ($ocLazyLoad, $q, $rootScope){
    var deferred = $q.defer();
    try{
        $ocLazyLoad.load($rootScope.statename).then(function(){
            deferred.resolve();
        });
    }
    catch (ex){
        deferred.reject(ex);
    }
    return deferred.promise;
}
function configRoutes($stateProvider, $urlRouterProvider, $ocLazyLoadProvider)
{
    $urlRouterProvider
        .when('action', 'action')
        .when('issue',  'issue')
        .when('lesson', 'lesson')
        .when('opportunity', 'opporutnity')
        .when('risk', 'risk')
        .otherwise('main');


    $ocLazyLoadProvider.config({
        modules: 
        [{
            name: 'action',
            files: ['app/tool/action/ActionController.js']
        },
        {
            name: 'risk',
            files: ['app/tool/risk/RiskController.js']
        }]
    });


    $stateProvider
        .state('main', {
            url: "/main",
            //templateUrl: '/app/tool/home/home.html',
        });

     $stateProvider
        .state('action', {
            name: 'action', <----------------------state name I want to capture for this url 
            url: "/actionitems",
            resolve: {
                loadDependencies: ['$ocLazyLoad', '$q', '$rootScope', load]
            },
            templateUrl: '/app/tool/action/ActionItems.html'
     });

      $stateProvider
        .state('risk', {
            name: 'risk',  <----------------------state name I want to capture for this url 
            url: "/risks",
            resolve: {
                loadDependencies: ['$ocLazyLoad', '$q', '$rootScope', load]
            },
            templateUrl: '/app/tool/risk/Risks.html'  
     });
}

Solution

  • I added the allowed method to the resolve section and cleaned up the code to get the desired outcome. I declared a global state to capture the value in $state$.name

    var state = '';
    
    //route-config.js
    function load($ocLazyLoad, $q)
    {
        var deferred = $q.defer();
        try
        {
            $ocLazyLoad.load(state).then(function ()
            {
                deferred.resolve();
            });
        }
        catch (ex)
        {
            deferred.reject(ex);
        }
        return deferred.promise;
    }
    
    
    function configRoutes($stateProvider, $urlRouterProvider, $ocLazyLoadProvider)
    {
    
        var res = 
        {
            loadDependencies: ['$ocLazyLoad', '$q', load],
            allowed: function ($state$)
            {
                state = $state$.name;
            }
        };
    
    
        $urlRouterProvider
            .when('action', 'action')
            .when('issue', 'issue')
            .when('lesson', 'lesson')
            .when('opportunity', 'opporutnity')
            .when('risk', 'risk')
            .otherwise('main');
    
    
        $ocLazyLoadProvider.config(
        {
            modules: [
            {
                name: 'action',
                files: ['app/tool/action/ActionController.js']
            },
            {
                name: 'risk',
                files: ['app/tool/risk/RiskController.js']
            }]
        });
    
    
        $stateProvider
           .state('action',
            {
                url: "/actionitems",
                resolve: res,
                templateUrl: '/app/tool/action/ActionItems.html'
            });
    
        $stateProvider
            .state('risk',
            {
                url: "/risks",
                resolve: res,
                templateUrl: '/app/tool/risk/Risks.html'
            });
    }