48

AngularJS を初めて使用するので、私がやろうとしていることを表す用語は遅延ロードだと思います。いくつかの異なるブログを見てきましたが、AngularJS のみを使用した完全に機能するソリューションは見つかりませんでした。

index.htmlに配置すると、すべて正常に動作することを理解してい<script src="js/process1.js"></script>ます。初期ロードでプルダウンされる js の量を削減しようとしています。

スクリプト タグがパーシャルにあると、ロードされないため、P1Ctrl は作成されません。そのため、現在、ユーザーがアプリケーションにアクセスして process55 にアクセスしない場合、ユーザーは使用されていなくても process55 のコードを保持しています。

process1 ルートが実行された時点で、ファイルをロードし、process1.js で作成されたオブジェクトを main で定義されたアプリに挿入する方法はありますか?

index.html:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Large Angular App</title>
    <link rel="stylesheet" href="lib/foundation/css/foundation.min.css" />
</head>
<body ng-app="largeApp" ng-controller="LargeAppController">

    <div>
        <a href="#/home">Home</a> | <a href="#/process1">Process1</a>
    </div>
    <br/>
    <br/>
    <br/>

    <ng-view>Test</ng-view>


    <script type="text/javascript" src="lib/jquery/jquery.min.js"></script>
    <script type="text/javascript" src="lib/angular/angular.js"></script>
    <script type="text/javascript" src="lib/angular/angular-route.js"></script>
    <script type="text/javascript" src="js/main.js"></script>
</body>
</html>

js/main.js:

var app = angular.module("largeApp", ['ngRoute']);

var appCtrl = app.controller("LargeAppController", function(){});


app.config(function ($routeProvider, $controllerProvider) {
    // save references to the providers

    app.registerCtrl = $controllerProvider.register,

    $routeProvider.when('/', {templateUrl: 'partials/home.html'});
      //Thinking I need to set up a resolve to fire off a script loader to load js.
    $routeProvider.when('/process1', {templateUrl: 'partials/process1/process1.html'});
    $routeProvider.otherwise({redirectTo: '/'});
});

パーシャル/home.html:

   <div>
    Home Page
   </div>

パーシャル/process1.html:

<script type="text/javascript" src="js/process1/Process1Controller.js"></script>
Process 1 {{process1data}}

js/process1.js:

console.log("I made it here");

app.registerCtrl('Process1Controller',function($scope){
            $scope.process1data = "Hello!";
        }
]);
4

1 に答える 1

21

コントローラーの遅延読み込みを簡単な方法で実装するには、次のことを行う必要があります。

$controllerProvider.registerアプリの変数 ( main.js )に保存します (既にブートストラップされた AngularJS アプリにコントローラーを追加する唯一の方法です)。

var app = angular.module('app',["ngRoute"]);
app.config(['$routeProvider', '$controllerProvider',
    function($routeProvider, $controllerProvider) {
        // remember mentioned function for later use
        app.registerCtrl = $controllerProvider.register;
        //your routes
        $routeProvider.when('/', {templateUrl: 'partials/home.html'});
        $routeProvider.when('/process1', {templateUrl: 'partials/process1.html'});
        $routeProvider.otherwise({redirectTo: '/'});
    }
]);

process1.html :

<script src="js/process1.js"></script>
<div ng-controller="P1Ctrl">
    {{content}}
</div>

そして今、process1.jsで以下を使用しますregisterCtrl

app.registerCtrl('P1Ctrl', function($scope)
{
   $scope.content = '...'; 
});

index.htmlはおそらく同じままです。あなたprocess1.jsがロードされているかどうかを確認してください(コントローラーではなくconsole.log()、本体で使用するだけです)。そうでない場合は、Angular の前に jQuery を含めます。process1.jsP1Ctrl

<script src="lib/jquery/jquery.js"></script>
<script src="lib/angular/angular.js"></script>

重要:この方法は、angular 1.2.0-rc.2 および 1.2.0-rc.3 では機能しません。これは、jQuery を使用したこの小さなトリックが機能しないためです。

.jsルート定義の依存関係としてファイルを使用する、より複雑な (そしてきれいな) ソリューションについては、次の記事を確認してください: http://ify.io/lazy-loading-in-angularjs/ - rc.2 および rc.3 でも動作します。記述された方法を実装するplunkは次のとおりです。

于 2013-10-17T19:46:09.857 に答える