2

我正在尝试定义一个通用路由来处理大部分请求。为每个功能添加添加路由是我觉得不好且不可维护的。

所以我的目标是编写一个通用路由并动态解决问题,包括解析所有依赖的控制器和服务文件、解析 templateUrl 和解析控制器名称。我可以解析/构造除控制器名称之外的所有内容。请帮我解决

我使用自定义解析器的路线:

$routeProvider
 .when('/:module/:controller/:action?', routeResolver.resolve())

在我的自定义解析器中:

function routeResolverProvider(){

this.$get= function(){
  return this;
}

this.resolve = function (options) {
 var route = {};

 route.templateUrl = function (params) {
     var path = String.format('/app/components/{0}/{1}.view.html', params.module, params.controller);
     return path;
 };

 //================================================================================
 route.controller='THIS IS WHAT I WANT TO CONSTRUCT FROM ROUTE as templateUrl'  
 //================================================================================

 route.resolve = {
   loadDependencies: ['$q', '$rootScope', '$route', function ($q, $rootScope, $route) {
      // MY RESOLVE LOGIC HERE
      // I construct dependent file path from route values
      // String.format('/app/components/{0}/{1}.controller.js', params.module, params.controller);
   }]
 };

 return route;
 }}

app.provider('routeResolver', routeResolverProvider)

一些好文章: https ://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection https://medium.com/opinionated-angularjs/advanced-routing-and-resolves-a2fcbf874a1c

4

2 回答 2

1

如果我正确理解您的问题,那么您希望能够按名称实例化控制器。

正如测试控制器中所解释的,这在 AngularJS 中是可能的。

您必须$controller像这样使用该服务:

$scope = $rootScope.$new();
$controller('NamedController', {$scope: $scope});

这是一个工作 plunker:http ://plnkr.co/edit/AVCEdLS9zhIzCyZgcXZF?p=preview

于 2014-11-04T13:13:54.850 回答
0

非常感谢丹,我也在寻找这种。所以我将我的解析器修改为最后的宾果游戏。

this.$get = ['$rootScope', '$scope', '$route', '$controller', function () {
    return this;
}];

route.controller = function ($rootScope, $scope, $route, $controller) {
    var params = $route.current.params;
    $controller(params.controller.toLowerCase() + 'Controller', {$scope: $scope});
}

最后我解决了我的问题,但想讨论这种方法可能存在的缺点。

于 2014-11-05T07:14:53.973 回答