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"(или любой другой подходящий контроллер)