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 に答える
4

私はこれと同じことを試みてきました。私が見つけた 1 つの解決策は、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 に答える