Javascript AngularJS,使用不同模板但相同控制器的多条路线如何?

Javascript AngularJS,使用不同模板但相同控制器的多条路线如何?,javascript,angularjs,routes,angular-routing,Javascript,Angularjs,Routes,Angular Routing,我正在调查我是否能得到标题上写的东西。 这是我的想法 让我们假设我有以下路线: .when('/', { templateUrl : 'partials/homepage.html', }) .when('/test', { templateUrl : 'partials/test.html', }) .when('/page/:pageID', { templateUrl : 'partials/page.html',

我正在调查我是否能得到标题上写的东西。 这是我的想法

让我们假设我有以下路线:

  .when('/', {
        templateUrl : 'partials/homepage.html',
  })

  .when('/test', {
        templateUrl : 'partials/test.html',
  })

  .when('/page/:pageID', {
        templateUrl : 'partials/page.html',
  })

  .when('/page/single/:pageID', {
        templateUrl : 'partials/page-single.html',
  })
直到现在,我才有机会在路由中添加templateUrl作为控制器的详细信息,并且一切正常

现在,应用程序已更改,只有一个控制器包含所有需要的信息,并且必须保留一个控制器。路线是这样的:

  .when('/:templateName/:pageID', {
       controller: 'myCtrl'
  })
我可以通过获取templateName参数从控制器设置模板id吗?如果是这样,那么最后一个路由示例/page/single/:pageID如何?我怎么知道路线上还有第二种选择

我可以使用templateName参数并使用$routeChangeSuccess方法查看它的变化,但是我找不到任何方法来动态设置模板


有什么想法吗?

一个解决方案可以是:

angular.module('myapp', []).
            config(['$routeProvider', function($routeProvider) {
            $routeProvider.when('/:templateName/:pageId', {
                templateUrl: function(urlattr){
                    return '/pages/' + urlattr.templateName + '.html';
                },
                controller: 'YourCtrl'
            });
        }
    ]);
从AngularJs 1.3文档中:

templateUrl
–{
string
|
function()
}–返回ngView应使用的html模板路径的路径或函数

如果templateUrl是一个函数,则将使用以下参数调用它:
数组。
-通过应用当前路由,从当前
$location.path()
提取路由参数


我会将您的
单例逻辑从控制器移动到服务。由于您没有提供太多代码,下面是一个示例,让您了解它是如何工作的

app.config(函数($routeProvider){
$routeProvider
。当(“/”{
templateUrl:“partials/homepage.html”,
控制器:“SingleController”
})
。当(“/test”{
templateUrl:'partials/test.html',
控制器:“SingleController”
})
.when(“/page/:pageId”{
templateUrl:'partials/page.html',
控制器:“SingleController”
});
});
app.provider('appState',function()){
这个。$get=[function(){
返回{
数据:{}
};
}];
});
app.controller('SingleController',函数($scope,appState){
$scope.data=appState.data;

});为什么要避免为您所在的州使用服务?与你的要求相反。嗯,我不确定,我只是想找到正确的方法。我有一个bug,一个控制器有很多范围和数据。我在想一种简单的方法来读取templateName参数,并用模板的路径更新一个作用域,然后只包含它,但我不确定这样做是否正确或安全。当然,这是可能的(请参阅下面的答案,尽管它没有保留您现有的控制器)。但是我会尝试从控制器中删除所有的
singleton
类逻辑,并将其移动到服务中。你能提供一个例子吗?我刚刚看到了编辑,谢谢。我试试看,很快就会回来:)