2014-07-20 33 views
1

我使用angular-seed和index-async.html啓動了一個角度項目,默認情況下它使用angular-loader和script.js。我爲這個項目增加了兩個控制器,每個控制器分別放在兩個文件中 該文件用於第一控制器開始這樣的:使用angular-loader和scriptjs異步加載多個控制器

angular.module('myApp.controllers').controller('FirstCtrl', ... 

該文件用於第二控制器開始這樣的:

angular.module('myApp.controllers').controller('SecondCtrl', ... 

然後在主app.js文件:

angular.module('myApp.controllers', []); 
angular.module('myApp', [ 
    'myApp.controllers' 
]) 

所有三個文件被添加到script.js:

$script([ 
     'bower_components/angular/angular.js', 
     'bower_components/angular-route/angular-route.js', 

     'js/app.js', 

     'js/controllers/first-ctrl.js', 
     'js/controllers/second-ctrl.js', 
    ], function() { 
     angular.bootstrap(document, ['myApp']); 
    }); 

當我運行應用程序時,有時它的工作原理,有時我得到的錯誤:

Uncaught Error: [$injector:nomod] http://errors.angularjs.org/1.2.20/ $injector/nomod?p0=myApp.controllers

Error: [ng:areq] Argument 'FirstCtrl' is not a function, got undefined

注意。爲了簡潔,我已經省略了routeprovider,但是我首先使用FirstCtrl進入路由。如果我使用SecondCtrl進行路由,我會遇到類似的問題。

我不認爲我已經用angular-seed改變了太多,所以我想知道如果我正在添加更多的控制器是否正確?

+0

檢查你的'FirstCtrl'是否正確。 'angular.module('myApp.controllers')。controller('FirstCtrl',function($ scope){});'還要注意,你的加載器是異步的。所以它有時可以在應用初始化之前加載控制器 – akn

+0

@akn我認爲這是角加載器在那裏的原因 - 所以scriptjs可以以任何順序加載角文件。 – Steve

+0

@Steve是,以任何順序,但有一個例外:模塊聲明'angular.module('myApp.controllers',[])'必須在將模塊實例返回到'angular.module('myApp.controllers')之前運行'。 – runTarm

回答

0

我發現$ script.js v2(尚未發佈)已經支持並行腳本加載,但也保留了執行順序。

您可以嘗試通過在以下文件中複製內容來升級它,並替換index-async.html中的舊內容。

https://github.com/ded/script.js/blob/v2/src/script.js

+0

感謝您的幫助。我試着再次在一個乾淨的角種子上再次發現這個問題,但無法實現。你的意思是https://github.com/ded/script.js/blob/master/dist/script.js? (你鏈接的腳本是3歲)。我嘗試了最新的腳本和相同的問題。很奇怪。 – Steve

+1

不,我的意思是'v2'分支中的代碼,請參閱[#19](https://github.com/ded/script。js/issues/19)討論訂單執行支持。 'v2'還沒有發佈。但看到它已經3歲了,所以我認爲你應該開始尋找另一個支持執行順序的庫。可以看看[LAB.js](http://labjs.com/),[Head.js](http://headjs.com/)或者進一步使用[require.js](http:/ /requirejs.org/)。 – runTarm

+0

另一個解決方法是將您的模塊聲明直接放在'index-async.html'中,或者如果您不介意在所有其他腳本之前同步加載'app.js',並將所有模塊聲明放入那裏。 – runTarm