21

我目前有一个内置路由的 AngularJS 应用程序,它与静态controller属性分配完美配合。但我真正想做的是动态分配具有不同路由的控制器:

$routeProvider
 .when("/Dashboards/:dashboardName",{
    templateUrl:function(params) {
                 return "Dashboards/" + params.dashboardName;
                //some ASP.NET MVC calls to return partial views (this part works)
        }
  })

我想做的是在controller这里对我的财产做同样的事情,比如:

$routeProvider
 .when("/Dashboards/:dashboardName",{
       templateUrl:function(params) {
             return "Dashboards/" + params.dashboardName;
            //some ASP.NET MVC calls to return partial views (this part works)
           },
       controller: function(params) {
             return params.dashboardName+"Controller"; (this part DOESN'T work)
           }
  })

但似乎我得到一个错误,说paramsProvider没有找到

那么有什么方法可以在路由配置中动态加载我的控制器功能名称吗?

4

5 回答 5

11

这可以使用angular ui-router来完成。

ui-router 允许您指定“controllerProvider”来指定提供控制器的功能。所以解决方案看起来像这样:

$stateProvider
.state("/Dashboards/:dashboardName",{
   templateUrl:function($stateParams) {
         return "Dashboards/" + $stateParams.dashboardName;
       },
   controllerProvider: function($stateParams) {
         return $stateParams.dashboardName+"Controller";
       }
  })

我希望它有帮助!

于 2014-01-07T20:13:52.260 回答
7

我没有在 $routeProvider 中指定控制器,而是将它放在 templateURL 中指定的文件中,从而解决了这个问题。

$routeProvider
 .when("/Dashboards/:dashboardName",{
    templateUrl:function(params) {
                 return "Dashboards/" + params.dashboardName;
        }
  })

DashboardsNAME.html

<div class="container" ng-Controller='DashboardsNAMEController'>Food</div>

这种技术仍然需要在路由实例化之前的某个时间点您已经注册DashboardsNAMEController。我怀疑最好的module.run()方法是在调用您自己的服务的方法中,但我在我的主控制器中这样做,因为它可以工作并且无论如何都是一个短控制器。

于 2013-12-05T05:30:40.617 回答
4

我一直在尝试同样的事情。我发现的一种解决方案是在您的 routeProvider 中执行此操作:

 $routeProvider
    .when("/Dashboards/:dashboardName",{
        templateUrl:function(params) {
            return "Dashboards/" + params.dashboardName;
        },
        controller: 'dynamicController'
 });

然后您计算要在“dynamicController”定义中加载什么“伪控制器”(因为没有更好的名称)。

var controllers = {
    unoController: function($scope, $routeParams, $rootScope) {
        // Do whatever
    },
    dosController: function($scope, $routeParams, $rootScope) {
        // Whatever for this controller
    }
}

app.controller('dynamicController', ['$scope', '$routeParams', '$rootScope', function($scope, $routeParams, $rootScope) {
    controllers[$routeParams.dashboardName+"Controller"]($scope, $routeParams, $rootScope);
}]);

这假设 $routeParams.dashboardName 是 ["uno","dos"] 之一。

对此我持保留态度,因为我在 Angular 上只有大约 3 天的时间,但到目前为止,这种方法对我想要完成的工作非常有效。

于 2013-10-08T08:28:30.633 回答
4

我不知道它是否取决于 AngularJS 版本,但您可以为controller属性提供一个函数,该函数成为实际的控制器。将此事实与控制器继承结合使用,您可以获得更简洁的代码,就像您正在寻找的代码一样,我认为:

$routeProvider
.when("/Dashboards/:dashboardName",{
    templateUrl:function(params) {
        return "Dashboards/" + params.dashboardName;
    },
    controller: function($scope, $routeParams, $controller) {
        /* this creates a child controller which, 
           if served as it is, should accomplish 
           your goal behaving as the actual controller
           (params.dashboardName + "Controller") */
        $controller($routeParams.dashboardName + "Controller", {$scope:$scope});
    }
})

免责声明:老实说,我不知道这种方法是否有任何缺点。不过看起来不是这样。

于 2014-04-05T19:04:22.437 回答
0

这也是可行的,(至少对我来说)。这可能有助于未来的人们寻找答案。

$stateProvider
    .state('foo', {
        url: '/foo/:bar',
        templateUrl: 'some-template-path.html',
        resolve : {
            getController : function($stateParams){
                if ($stateParams.bar === "tab1") {

                    return "tab1Controller"

                }else if ($stateParams.bar === "tab2") {

                    return "tab2Controller"

                }else if ($stateParams.bar === "tab3"){

                    return "tab3Controller"

                }else if ($stateParams.bar === "tab4") {

                    return "tab4Controller"

                }
            }
        },
        controllerProvider: function(getController){
            return getController;
        },

不是最短的代码,但至少更容易阅读。此外,如果您想为controllertab/dashboardName 名称提供不同的名称。

于 2015-08-12T16:40:15.080 回答