2012-09-21 5 views
8

私のルートの一部に外部JSの機能が必要です。これらのJSは特定のルート(たとえば、/uploadは写真のアップロードにJSが必要、/photosはライトボックス用の別のJSが必要、/funnyにはアニメーション用のJSが必要など)を一度にロードする必要はありません。AngularJSコントローラの1つに外部JavaScriptを遅延ロードする

これらの外部JavaScriptを遅延ロードするにはどうすればよいですか?

私はこのような場合を処理するために知っているそれらのルートが複数回アクセスすることができる(例えば、ユーザは再び/upload/photos次いで/uploadに行くことができる)

答えて

2

唯一の方法は、ルートの「解決法」を用いています。このメソッドは、ルートのコントローラがインスタンス化される前にロードされる依存関係を定義するために使用できます。このメソッドの異なる戻り値の型の1つが約束です。したがって、これを使用して、外部JavaScriptコードのロードを非同期で開始し、外部スクリプトがロードされるとすぐに解決される約束を返すことができます。

このドキュメントは、「when」セクションのhttps://docs.angularjs.org/api/ngRoute/provider/$routeProviderにあります。

2

@ alex3683の答えはおそらく正しいAngularJSの方法ですが、私は概念を把握していないので、代わりにjQueryのgetScript()を使用します。だから、CoffeeScriptで:

yourModule.factory 'foo', -> 
    $.getScript 'https://script-to-load', -> 
     # whatever you want to do once the script is loaded 

そしてあなたのコントローラからそれを呼び出してください。 AngularJSサービスは怠惰でシングルトンなので、スクリプトは一度だけロードされます。

3

アレックスが述べたことに加えて、コントローラやディレクティブなどのAngularJSアーチファクトを怠ってロードする場合は、モジュールAPIの代わりに関連プロバイダを使用して登録する必要があります。アプリケーションがブートストラップされた後で、モジュールAPIを使用して登録されたアーティファクトは、アプリケーションで使用できなくなります。たとえば、あなたが...これの代わりに

$controllerProvider.register('SomeLazyController', function($scope) 
{ 
    $scope.key = '...'; 
}); 

...私は "を使用する方法だけでなく、これを詳細にブログの記事を書かれている

angular.module('app').controller('SomeLazyController', function($scope) 
{ 
    $scope.key = '...'; 
}); 

をこのような怠惰なコントローラーを定義しますAnglesJSでの遅延読み込みを実装するために、Alexが話している「解決する」メソッドです。 http://ify.io/lazy-loading-in-angularjs/