LoginSignup
14
14

More than 5 years have passed since last update.

AngularJS で controller, service 等を遅延ロード(定義)する

Posted at

AngularJS で controller, service などが定義された JavaScript ファイルを遅延ロードした場合、通常のような書き方では Injector から対象のオブジェクトが取得できない。なので、以下のようにする。

※公式的にこれでいいのかどうかは不明だけどメソッドが生えてるってことはこれでいいのかしら。ちなみにソースはこれ

メインのファイル
main.js
var app = angular.module('sample', []);

// Config で、遅延ロード(定義)する対象のプロバイダーを config 内で app へ alias をはっておく
app.config(['$provide', '$controllerProvider', '$animateProvider', '$filterProvider', '$compileProvider',
    function($provide,   $controllerProvider,   $animateProvider,   $filterProvider,   $compileProvider) {

        // Service 系 (service, factory, value, constant) は $provide
        app.$provide = $provide;

        // あとは名前の通り
        app.$controllerProvider = $controllerProvider;
        app.$animateProvider = $animateProvider;
        app.$filterProvider = $filterProvider;
        app.compileProvider = $compileProvider;
}]);

app.controller('mainController', ['$injector', function($injector) {
    // 以下の lazy.js を読み込むとして
    loadScript().then(function() {
        // ここで読み込んだファイル内に定義した各オブジェクトを $injector から取得できる
        var lazyService = $injector.get('lazyService');
    });
}]);
遅延ロードされるファイル
lazy.js
var app = angular.module('sample');

//////// service を定義
// $provide にはその他、.factory(), .value(), .constant() というメソッドが生えてるので、以下と同様に使用できる
app.$provide.service('lazyService', function() {

});

//////// controller を定義
// ${hoge}Provider というプロバイダーは、 .register() メソッドで定義を行うので注意
app.$controllerProvider.register('lazyController', function() {

});

ちなみに angular-loader とか非同期でスクリプトを読み込む系のプラグインも、上記と同じようなことを行って実現しているっぽい(流し見した)

僕は FlashCC からはき出した CreateJS の中に API として AngularJS のオブジェクトを定義した時に通常の記法だと $injector から取得できず、どうしていいのか分からなかったので上記のような方法をとりました。

14
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14