AngularJS — Как мне получить имя состояния внутри функции разрешения состояния для загрузки файлов контроллера?

#javascript #angularjs #angular-ui-router #oclazyload

#javascript #angularjs #angular-ui-router #oclazyload

Вопрос:

Я пытаюсь погрузиться в свое первое полноценное приложение AngularJS, используя PHP и адаптированное к подходу, ориентированному на api.

Я достиг этой точки:

Я хочу иметь возможность записывать имя состояния внутри $ stateProvider ниже с целью передачи в функцию загрузки. Однако я не могу получить значение $rootScope.statename, которое не определено. Я удалил это из своего решения, потому что не смог заставить его помочь удалить undefined из инструкции load function alert.

Как мне записать ( risk или actionitem ) в качестве желаемого имени состояния, чтобы иметь возможность передавать в load функцию?

app.js -Удален фрагмент кода

 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'  
     });
}
  

Ответ №1:

$state.current содержит всю информацию о текущем состоянии, включая имя. Так $state.current.name вы получите необходимую информацию.

Комментарии:

1. $rootScope.statename остается пустой строкой в методе загрузки после внесения изменений для использования $state.current.name в app.run

Ответ №2:

Просто сохраняйте код простым:

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

Комментарии:

1. Я добавил allowed: function ($state$){state = $state$.name;} для установки глобального состояния var. Затем я использую параметр состояния загрузки в методе загрузки.

2. Я постараюсь упростить код, но я ценю ответ!

Ответ №3:

Я добавил allowed метод в раздел разрешения и очистил код, чтобы получить желаемый результат. Я объявил глобальное состояние, чтобы зафиксировать значение в $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'
        });
}