4

ng-includeスコープ内のいくつかの変数に基づいて、動的なテンプレートとコントローラーを持つディレクティブを使用しています。現在、私はこのような地図を持っています。

$scope.map = {
    'key1': {
        controller: Ctrl1,
        templateUrl: 'tmpl1.html'
 }, 
'key12': {
        controller: Ctrl2,
    templateUrl: 'tmpl1.html'
    }
}

...

<div ng-include src="map[key].templateUrl" ng-controller="map[key].controller"></div>

ただし、このマップを破棄し、代わりに文字列を介して templateUrl とコントローラーを生成したいと思います。以下はコントローラーオブジェクトを返しますが、関数を返す必要があります。

var ctrlObj = angular.module('moduleName').controller('ControllerName')

編集1

明確にするために:

ただし、このマップを破棄し、代わりに文字列を介して templateUrl とコントローラーを生成したいと思います

基本的に、構成よりも規則になるように、ページに「サブコントローラー」を設定します。すべてのサブコントローラーが共有する情報を持つマスターコントローラー: FooCtrl が「マスター」コントローラーになり、FooBarCtrl、FooBarSubCtrl がサブコントローラーになります。私の目標は、「Bar」を「FooBarCtrl」に解決し、そこから適切なコントローラー関数を取得する関数を作成することです。

4

3 に答える 3

2

これを達成する簡単な方法はわかりませんが、2 つの解決策が考えられます。

  1. ngInclude ディレクティブを変更して、src 式を取得し、それを解析してコントローラー名を取得し (テンプレート Foo.html => コントローラー FooCtrl)、ngView で行われるように要素にコントローラーを設定します ( https://github.com/ angular/angular.js/blob/master/src/ng/directive/ngView.js#L149 ):

    controller = $controller(current.controller, {$scope: lastScope});
    element.contents().data('$ngControllerController', controller);
    
  2. src式を監視し、ポイント1と同じ方法でコントローラーを要素にリンクする「ajpaz-controller」などの新しいディレクティブを作成します。明らかな利点は、元のng-includeを変更せずに実行できることです。このように動作します

    <div ng-include src="templateUrl" ajpaz-controller>
    

したがって、現在の templateUrl のみを親コントローラーに保持する必要があります。それが理にかなっていることを願っています;)

于 2012-12-04T21:10:00.223 に答える
1

この質問が投稿されてから長い時間が経っていることは知っていますが、他の人が正しい答えを知っていると役立つかもしれません...

$controllerProvider を使用して、通常の方法で登録した場合:

app.controller('myController', function() {
    //blah, blah
});

$controller サービスを使用してコントローラー関数を取得できます。これは getter のように機能します。

$controller('myController');

もちろん、注入することを忘れないでください... ;-)

于 2016-10-26T11:27:40.730 に答える
0

以下のスタックオーバーフローのリンクから。この質問に対する答えがあると思います。

angular.module().controller() で作成された Angular Controller の使用

与えられた:

angular.module('App.controllers', [])
    .controller('home', function () {
        $scope.property = true;
    }]);

答え:

// Try using a string identifier.

routeProvider.when('/', {templateUrl: 'partials/home.html', controller: 'home'});
于 2013-03-29T20:03:58.933 に答える