2014-03-19 45 views
0

我有一個使用ngTable和UI自舉一個SPA。該頁面引用在頂層模塊中定義的頂層控制器,以及在其他模塊中定義的幾個嵌套控制器。從嵌套控制器到頂級控制器中的服務或範圍變量有幾個明確的引用,所以嵌套模塊具有對頂級模塊的引用。但是,爲了使其無錯運行,我必須引用頂級模塊中的所有嵌套模塊。當前AngularJS模塊的組織需要循環模塊引用

如果我不從頂層模塊引用嵌套的模塊,我得到這樣的錯誤:

Error: [ng:areq] Argument 'DataSourcesCtrl' is not a function, got undefined 
http://errors.angularjs.org/1.2.4/ng/areq?p0=DataSourcesCtrl&p1=not%20a%20function%2C%20got%20undefined 
minErr/<@http://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:78 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:1358 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:1369 
@http://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:6682 
applyDirectivesToNode/nodeLinkFn/<@http://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:6098 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:307 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:6085 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:5551 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:5459 
[email protected]://run.plnkr.co/plunks/EBVfG1gWYv7xf8sa5v8a/ui-bootstrap-tpls-0.10.0.js:2822 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:6140 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:5548 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:5459 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:5570 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:6160 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:18996 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:11449 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:11552 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:11803 
bootstrap/doBootstrap/<@http://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:1297 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:3644 
bootstrap/[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:1296 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:1309 
[email protected]://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:1258 
@http://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.js:20306 
n.Callbacks/[email protected]://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js:2 
n.Callbacks/[email protected]://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js:2 
[email protected]://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js:2 
[email protected]://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js:2 

<div class="tab-pane ng-scope" ng-repeat="tab in tabs" ng-class="{active: tab.active}" tab-content-transclude="tab"> 

正如你可以在我的plunkr看到演示此,「DataSourcesCtrl」是在「dataSourcesMod.js」的「DataSourcesModule」中定義的控制器。如果您註釋掉「diagapp.js」頂部附近的行,它將無誤地運行。

這就是「diagapp.js」的頂部看起來像:

var diagapp = angular.module("DiagApp", ['ui.bootstrap' 
//     , 'DataSourcesModule' // Comment out this line to demonstrate problem 
            ]); 

我想我現在明白爲什麼我要加載所有的頂層模塊中的模塊,否則有沒有其他方式來加載這些模塊。但是,當我這樣做時,我最終得到循環模塊引用,這似乎是錯誤的。頂層模塊內沒有任何內容引用嵌套模塊中的任何內容。

好像我需要調整我的模塊組織。處理這個問題的最佳方法是什麼?

回答

0

我想最明顯的,合理的建議是有加載所有其他所需模塊的頁面,與該模塊的任何配置設置沿頂層模塊,但它有沒有直接需要通過任何其他模塊。

在這個例子中,這將意味着分離出頂層「DiagApp」模塊的一些片放入一個「DiagMod」模塊。這將包括其他模塊需要使用的任何組件。如果頂層模塊不需要任何配置設置,那麼頂層模塊只會有一行指定頁面上使用的所有模塊,包括新的「DiagMod」模塊。