AngularJS Динамически загружаемый контроллер и шаблон на основе маршрута

Я пытаюсь динамически загрузить ОБА шаблон и контроллер на основе маршрута (в Angular 1.6), используя текущую архитектуру каталогов.

    приложение
    |__login.module.js
    |__home.controller.js
    |__login.factory.js
    |__home.view.html
    |__404.view.html
    |__index.html

В настоящее время приведенный ниже код работает для получения правильного шаблона, но контроллер не загружается:

    angular.module ('common.auto-loading-route', []).config(function($routeProvider){

    function getTemplate(routeParams){
        var route = (routeParams.current)? routeParams.current.params.route: routeParams.route;
        var directory = route.split('/');
        directory = directory.filter(function(entry) { return entry.trim()!= ''; });
        var page = directory[directory.length - 1];
        directory.splice(-1,1);
        directory = directory.join('/'); возврат каталога + '/' + page +'.view.html';
    } функция getController(routeParams){
        // Я думаю, Здесь мне нужно обещание, но я не знаю, как его написать routeParams = routeParams.route.split('/'). Join ('.'); Вернуть routeParams + 'controller';
    }

    $routeProvider.when('/:route*', {
        controller: function($routeParams) { // не работает return getController($routeParams);
        },
        templateUrl: function($routeParams) { //works
            return getTemplate($routeParams);
        }, решить: {
            check: function($route, $http, $location){
                return $http.get(getTemplate($route)).then(function(response){
                    if (response.status!== 404){верните истину;
                    } else {
                        $location.path('404');
                    }
                });
            }
        }
    }). иначе ('/404');
});

Я понимаю, что контроллеры должны присутствовать в начале приложения, но я не могу написать правильное resolve с promise заявление.

Может ли кто-нибудь помочь мне исправить решение с помощью простого обещания, которое возвращает строку с именем контроллера в зависимости от маршрута?

1 ответ

Решение

Я смог заставить его работать, вообще не включая контроллер в маршрутизацию. Вместо этого я поместил атрибут ng-controller в представление, которое я загружал.

Это сработало!

angular.module ('common.auto-loading-route', []).config(function($routeProvider){

    function getTemplate(routeParams){
        var route = (routeParams.current)? routeParams.current.params.route: routeParams.route;
        var directory = route.split('/');
        directory = directory.filter(function(entry) { return entry.trim()!= ''; });
        var page = directory[directory.length - 1];
        directory.splice(-1,1);
        directory = directory.join('/'); возврат директории + '/' + page +'.view.html';
    }

    $routeProvider.when('/:route*', {
        templateUrl: function($routeParams) { //works
            return getTemplate($routeParams);
        }, разрешение: {
            check: function($route, $http, $location){
                return $http.get(getTemplate($route))).then(function(response){
                    if (response.status!== 404){
                        return true;
                    } else {
                        $location.path('404');
                    }
                });
            }
        }
    }). в противном случае ('/404');
}); 

В HTML этого представления я просто

 нг-контроллер = "home.controller" 
(или любой другой подходящий контроллер)

Другие вопросы по тегам