У меня следующая конфигурация для моего маршрута:

        $routeProvider.when('/', {
            controller: 'homeController',
            templateUrl: 'app/views/main/home.html'
        })
            .when('/:section/:tree', {
                templateUrl: function($routeParams) { return 'App/Views/'+$routeParams.section+'/'+$routeParams.tree+'.html'; },
                controller: function ($routeParams) { return $routeParams.tree + 'Controller'; }
            })
            .otherwise({
                redirectTo: '/'
            });
    }

Представление загружено правильно, но без контроллера, и функция контроллера даже не вызывается. Есть ли способ решить эту проблему или определить контроллер на основе параметров маршрута.

Manar Husrieh

Ответов: 1

Ответы (1)

Функция контроллера не является функцией, возвращающей имя контроллера. Это должен быть сам контроллер.

Предположим, параметр маршрута tree может быть Foo или Bar, вам просто нужно

.when('/:section/Foo', {
    templateUrl: function($routeParams) { return 'App/Views/'+$routeParams.section+'/Foo.html'; },
    controller: 'FooController'
})
.when('/:section/Bar', {
    templateUrl: function($routeParams) { return 'App/Views/'+$routeParams.section+'/Bar.html'; },
    controller: 'BarController'
})

Это, кстати, не позволит вашему приложению вызвать исключение, если пользователь вводит что-то отличное от Foo или Bar в URL-адресе.

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

['Foo', 'Bar', 'Baz', 'Brr', ...].forEach(function(tree) {
    $routeProvider.when('/:section/' + tree, {
        templateUrl: function($routeParams) { return 'App/Views/' + $routeParams.section+'/' + tree + '.html'; },
        controller: tree + 'Controller' 
    });
});

2022 WebDevInsider