2013-10-17 81 views
46

AngularJS非常新,我猜測我所要做的是延遲加載。我查看了幾個不同的博客,我還沒有找到完全使用AngularJS的完整工作解決方案。Angular JS:如何加載部分中的js文件

據我所知,如果我把<script src="js/process1.js"></script>放在index.html中,一切正常,我試圖減少在初始加載時拉下的js的數量。

隨着腳本標籤坐在部分,它永遠不會被加載,所以P1Ctrl永遠不會被創建。因此,目前,如果用戶進入應用程序並且永遠不會進入process55,那麼即使該用戶從未使用過,該用戶仍然擁有用於process55的代碼。

有沒有一種方法來加載文件,並將process1.js中創建的對象插入到main中定義的應用程序中,在執行process1時執行?

的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!"; 
     } 
]); 

回答

21

爲了實現簡單的方法控制器的延遲加載,你必須做到以下幾點:

保存$controllerProvider.register(這是唯一的方法以控制器加入到已自舉AngularJS應用程序)變量在您的應用程序(main.js):

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是否正在加載(僅在process1.js的正文中使用console.log(),而不是在P1Ctrl控制器中)。如果不是,包括jQuery的前角:

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

重要:這種方法不具有角1.2.0-rc.2和1.2.0-rc.3工作,因爲這個小竅門與jQuery不起作用。

對於更復雜的(和漂亮)解決方案,以.js文件作爲依賴於路由定義,請檢查文章:http://ify.io/lazy-loading-in-angularjs/ - 它也可以與rc.2和rc.3。這裏是plunk實現描述的方法:http://plnkr.co/edit/ukWikO5TVDtQ1l9WlrGD

+0

把所有這一切放在一起,它不會中斷,但它也不起作用。試過有沒有jQuery的參考。該頁面顯示沒有錯誤,但js從未被調用,並且數據被控制器放入視圖中。看看你提到的這個IFY網站似乎表明我需要一個腳本加載器並使用promise。我知道我很接近......但還不夠完美。 – John

+1

我剛剛意識到使用jQuery的這個技巧不適用於Angular 1.2。 – lort

+0

這個技巧切換到了1.1.5。 – John