2014-03-26 93 views
1

我遇到了一個問題,設置嵌套視圖的狀態。angular-ui-router嵌套狀態「沒有這樣的狀態」父母

下面是我的測試模板的相關部分,它正在我的index.html中加載到'main'ui視圖中。

<div class="row-fluid"> 
<div class="col-lg-3"> 
    <ul class="nav nav-list"> 
     <li class="nav-header">Header 1</li> 
     <li class="active"><a href="#/test/page1">Page 1</a></li> 
     <li><a href="#/test/page2">Page 2</a></li> 
     <li class="nav-header">Header 2</li> 
     <li><a href="#/test/page3">Page 3</a></li> 
    </ul> 
</div> 
<div class="col-lg-9"> 
    <div class="container" ui-view="testcontent"></div> 
</div> 

下面是我的測試模塊的JS。

angular.module('test', [ 
    'ui.state', 
    'ui.bootstrap', 
    'test.page1', 
    'test.page2', 
    'test.page3' 
]) 

.config(function config($stateProvider) { 
    $stateProvider.state('test', { 
     url: '/test', 
     templateUrl: 'test/test.tpl.html', 
     views: { 
      "main": { 
       controller: 'TestCtrl', 
       templateUrl: 'test/test.tpl.html' 
      } 
     }, 
     data:{ pageTitle: 'Test' } 
    }) 
    .state('test.page1', { 
     url: '/page1', 
     views: { 
      "[email protected]": { 
       controller: 'Test1Ctrl', 
       templateUrl: 'test/page1/page1.tpl.html' 
      } 
     }, 
     data:{ pageTitle: 'Test Page 1' } 
    }) 
    .state('test.page2', { 
     url: '/page2', 
     views: { 
      "[email protected]": { 
       controller: 'Test2Ctrl', 
       templateUrl: 'test/page2/page2.tpl.html' 
      } 
     }, 
     data:{ pageTitle: 'Test Page 2' } 
    }) 
    //.state('test.page3', { 
    // url: '/page3', 
    // views: { 
    //  "[email protected]": { 
    //   controller: 'Test3Ctrl', 
    //   templateUrl: 'test/page3/page3.tpl.html' 
    //  } 
    // }, 
    // data:{ pageTitle: 'Test Page 3' } 
    //}) 
    ; 
}) // Module configuration 

.controller('TestCtrl', function TestCtrl($scope) { 

}); 

這工作正常,如果在父母的模塊的配置設置狀態的配置。

我想要做的是在模塊的配置部分設置狀態,而不是在父級。

angular.module('test.page3', [ 
    'ui.state', 
    'ui.bootstrap', 
    'test' 
]) 

.config(function config($stateProvider) { 
    $stateProvider.state('test.page3', { 
     url: '/page3', 
     views: { 
      "[email protected]": { 
       controller: 'Test3Ctrl', 
       templateUrl: 'test/page3/page3.tpl.html' 
      } 
     }, 
     data:{ pageTitle: 'Test Page 3' } 
    }); 
}) // Module configuration 

.controller('Test3Ctrl', function Test3Ctrl($scope) { 

}); 

如果我嘗試AppCtrl toBeTruthy這個然後我一般測試一個錯誤炸燬「未能實例模塊test.page3因:沒有這樣的狀態測試」。

有沒有辦法做到這一點,或者我堅持鏈接在測試模塊中的所有.state()調用?

+0

模塊中存在一個循環依賴問題,所以我給了lib3d的回答。謝謝!我最終在測試模塊的依賴關係中需要test.page1,test.page2和test.page3,並在每個子模塊中刪除了測試的依賴關係。我最終更新了從〜0.0.1到0.2.10的angular-ui-router,這導致我必須將ui.state更改爲ui.router,但它允許我將狀態移至子配置節,而不是鏈接它們全部放在測試模塊中。 – MattP

+0

謝謝。但是,你一定要扭轉你的樹木樹並使其工作。將爲您的模塊提供服務的子模塊與僅在應用程序層次結構中插入頁面的子模塊之間存在差異。 – lib3d

+0

這是我能夠使其工作的唯一方法。當我試圖改變周圍的命令時,找不到路線並將我送到。其他地方。 – MattP

回答

1

首先,你有一個問題:循環模塊依賴。 test取決於test.page3,其取決於test

然後,使用父模塊的父狀態的模塊應該依賴於它。

有以下模塊聲明:

angular.module('test', [ 
    'ui.state', 
    'ui.bootstrap' 
]); 

angular.module('test.page3', [ 
    'test' 
]); 

而且你$stateProvider配置將正常工作。

您應該最終能夠爲其他頁面提供相同的依賴關係結構。

+0

這會導致錯誤消息在我運行單元測試時消失,但似乎是因爲它不再嘗試加載該模塊。當我點擊第3頁的鏈接時,它會轉到$ urlRouterProvider.otherwise。同時將test.pageN的依賴關係從測試模塊中取出似乎會破壞angularjs綁定,因此所有內容都顯示爲{{foo}}。 – MattP

+0

在你的單元測試中,你應該加載兩個模塊(test和test.page3)。我在這裏介紹的依賴關係樹是我用uirouter在生產環境中使用的依賴關係樹,它工作正常。除了我用父'狀態屬性聲明父狀態而不是狀態名稱前綴。 – lib3d

+0

單元測試通過從我的測試模塊的依賴項中移除'test.page3'。當我點擊'#/ test/page3'的鏈接時,會發生什麼情況?我將被髮送到$ urlRouterProvider.otherwise而不是page3。將狀態更改爲「page3」並提供父狀態屬性沒有區別。 page1和page2在原始代碼中工作,但前提是將依賴項包含在'test.page1'和'test.page2'中。 – MattP