2

ほとんどのリクエストを処理する一般的なルートを定義しようとしています。機能を追加するたびにルートを追加することは、私が気分が悪く、保守しにくいと感じていることです。

したがって、私の目標は、汎用ルートを作成し、依存関係を動的に解決することです。これには、すべての依存コントローラーとサービス ファイルの解決、templateUrl の解決、およびコントローラー名の解決が含まれます。controller name 以外のすべてを解決/構築できます。助けてください

カスタムリゾルバーを使用した私のルート:

$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

私があなたの質問を正しく理解していれば、コントローラーを名前でインスタンス化できるようにしたいと考えています。

Testing Controllersで説明されているように、これは AngularJS で可能です。

$controller次のようにサービスを使用する必要があります。

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

ここに作業プランカーがあります: 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 に答える