2013-07-16 25 views
15

魅力的な読み込みについて多くのことを読んでいますが、$ routeProviderを使用しているときに問題が発生しています。AngularJSコントローラを動的にロードする

私の目標は、コントローラーを含むjavascriptファイルをロードし、以前にロードされたこのコントローラーにルートを追加することです。角度bootstapが呼び出されたときに

angular.module('demoApp.modules').controller('MouseTestCtrlA', ['$scope', function ($scope) { 
    console.log("MouseTestCtrlA"); 
    $scope.name = "MouseTestCtrlA"; 
}]); 

にこのファイルをロードするために私のJavaScriptファイルの

コンテンツが含まれていません。つまり、ファイルをロードしてこのコントローラへのルートを作成する必要があります。

まず、Javascriptファイルをロードする必要がある解決機能を作成しました。しかし、私のコントローラのパラメータは私にエラーを与えたルート宣言で宣言:

「MouseTestCtrlA」の関数ではありません、ここでは未定義

を得たことは、私が設定しようとしています呼び出しです:

demoApp.routeProvider.when(module.action, {templateUrl: module.template, controller: module.controller, resolve : {deps: function() /*load JS file*/} }); 
私が読んだものから、

は、コントローラのパラメータが登録され、コントローラ

詐欺でなければなりませんtroller - {(string | function()=} - 新しく作成されたスコープに関連するコントローラfnまたは文字列として渡された場合に登録されたコントローラの名前。

私は私のファイルをロードできるはずです。そして、私は新しいルートを宣言しようとします。

それは私に依存関係が負荷にJavaScriptファイルパスの配列です以下のようなものが得られた:

使用

ScriptLoader.load(module.dependencies).then(function() { 
    demoApp.routeProvider.when(module.action, {templateUrl: 'my-template', controller: module.controller}); 
}); 

スクリプトローダ

angular.module('demoApp.services').factory('ScriptLoader', ['$q', '$rootScope', function ($q, $rootScope) { 
     return { 
      load: function (dependencies) 
      { 
       var deferred = $q.defer(); 
       require(dependencies, function() { 
        $rootScope.$apply(function() { 
         deferred.resolve(); 
        }); 
       }); 
       return deferred.promise; 
      } 
     } 
    }]); 

問題

"MouseTestCtrlA 'は関数ではありません。未定義です。つまり、Angularは登録されたコントローラとして' MouseTestCtrlA 'を解決できませんでした。

誰でもこの時点で私を助けてくれますか?

答えて

26

この記事を再度読んでくださいhttp://ify.io/lazy-loading-in-angularjs/$contentProviderのインスタンスを角型アプリケーションの中に保つことを提案しました。

私のアプリでこのコードを思いついた。JS

demoApp.config(function ($controllerProvider) { 
    demoApp.controller = $controllerProvider.register; 
}); 

それは外部のJavaScriptファイルに予想どおりに私のコントローラを書くために私を可能にします:これは助けることができる

angular.module("demoApp").controller('MouseTestCtrlA', fn); 

願っています!

+0

ありがとう、私はしばらくの間これを探していました。うまくいけば角度の機能バージョンは、コントローラが動的に読み込まれるようにレジスタ関数を公開する方法を見つけるでしょう。 – ltfishie

+0

私はあなたが使用することをお勧めします角カウチポテト。コントローラ/ファクトリ/サービス/ etcを遅延登録します。 [github](https://github.com/castawaylabs/semaphore)に書いた公開アプリ(Require + Angular + UIRouter)。 –

+0

このコードは私の夕方を保存しました:) – Yasser