2014-04-08 104 views
17

我有一個使用偉大的ui路由器的Angular應用程序。Angular UI路由器 - 在父級訪問狀態參數

我的設置是這樣的:

.config(function ($stateProvider, $urlRouterProvider) { 

    $stateProvider 

    // PROJECT DETAIL 
    .state('project', { 
     url: '/project/:projectId/', 
     resolve: { 
      /* some base api calls */ 
     }, 
     views: { 
      'task-list': { 
       templateUrl: 'partials/task_list.tmpl.html', 
       controller: 'TaskListCtrl', 
       resolve: { 
        tasks: function ($stateParams, ConcernService) { 
         return ConcernService.get('project-tasks/', $stateParams.projectId); 
        }, 
       } 
      }, 
      'concern-instance': { 
       /* some resolved variables */ 
      } 
     } 
    }) 
    .state('project.task', { 
     url: 'task/:taskId/', 
     views: { 
      '[email protected]': { 
       /* some different resolved variables */ 
      }, 
     } 
    }) 

這像黃油的所有作品。但是,在task_list模板中,如果狀態爲project.task,我希望能夠訪問taskId param,這樣我可以突出顯示活動的導航鏈接,即使url爲#/project/123/task/456/,taskId爲空。我知道這是因爲模板只能訪問爲該狀態聲明的參數。所以如果我想在project.task狀態下獲得taskId,我該怎麼做?是否需要重新申報porject.task中的task-list

任何幫助非常感謝。

+1

這是一個惱人的問題。如果您不需要父控制器/模板中的狀態參數,則可以刪除父狀態的url,併爲子狀態聲明完整的URL。如果你這樣做,那麼我想你可以把狀態參數放在一個變量的範圍中,以供孩子們訪問。 – aet

+1

我們遇到了與您描述的相同的問題。您現在可能已經知道了,但實際上您可以通過'$ state.params'獲取所有參數。但是,如果你和我一樣,那麼在你的控制器中以不同的方式獲取你的參數並不適合你。到目前爲止,我在[documentation](https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service/)中發現的最接近的東西描述了父母國家的相反問題param不適用於子狀態。你有沒有想過(通過'$ stateParams')? – Manny

+0

你有沒有想過這個?我也有同樣的問題。 – pankaj

回答

-1

你如何訪問taskId?它應該是這樣的,從官方documentation採取:

$stateProvider 
    .state('contacts.detail', { 
     url: "/contacts/:contactId", 
     templateUrl: 'contacts.detail.html', 
     controller: function ($stateParams) { 
      // If we got here from a url of /contacts/42 
      expect($stateParams).toBe({contactId: 42}); 
     } 
    }) 
14

在UI的路由器文檔here他們解釋說

「的$ stateParams對象將只包含了 與註冊的PARAMS州。」

您只能使用父級的resolve屬性訪問子狀態下的父狀態參數。

把這個在您的 '項目' 狀態(父):

...  
resolve: { 
    // Expose projectId parameter to child states 
    projectId: ['$stateParams', function ($stateParams) { 
     return $stateParams.projectId; 
    }] 
}, 
控制器內

然後你狀態'project.task'(孩子),你應該同時訪問

$stateParams.projectId 

$stateParams.taskId 
+0

@DarwinTech如果此作品請標記爲答案。 Thx – goodies4uall

4

我注意到$state.params包含子狀態參數。似乎無法找到任何文檔。它只是工作

+0

你是對的!我的生命已被拯救!:)謝謝! – Nat

相關問題