Angularjs ui-router não alcançando o controlador filho

Eu tenho uma function de configuração:

function config($stateProvider,$locationProvider) { $locationProvider.html5Mode(true); $stateProvider .state('projectsWs.tasks', { url: "/tasks", views: { "mainView": { templateUrl: "/app/projects/templates/index.php" }, "innerView": { templateUrl: "/app/projects/templates/tasks.php", controller: tasksCtrl, controllerAs:'tasks' } } }) .state('projectsWs.tasks.detail', { url: "/:taskId", views: { "mainView@": { templateUrl: "/app/projects/templates/index.php" }, "innerView@mainView": { templateUrl: "/app/projects/templates/tasks.php", controller: function($stateParams) { console.log('innerViewCtrl', $stateParams); } } } });} 

O InnerView está dentro do mainView. Quando eu tenho url como /projects-ws/tasks , a function tasksCtrl funciona como esperado. Mas quando eu tenho url com um id, ou seja, /projects-ws/tasks/32 , não vejo nenhuma saída, mas espero que a saída innerViewCtrl , esse é o problema que eu tenho. Acho que tenho um problema com as visualizações absolutas / relativas, mas já tentei todas as combinações e ainda não funcionam.

UPDATE: Então agora eu tenho seguinte estado:

 state('projectsWs.tasks.detail', { url: "/:taskId", views: { "mainView@": { templateUrl: "/app/projects/templates/index.php", controller: function($stateParams) { console.log('mainViewctrl', $stateParams); } }, "innerView": { templateUrl: "/app/projects/templates/tasks.php", controller: function($stateParams) { console.log('innerViewctrl', $stateParams); } } } }) 

como Radim Köhler disse. Ele produz o mainViewctrl Object {taskId: "32"} , mas como posso alcançar $stateParams.taskId partir do innerView agora?

Nomeação absoluta com o roteador de interface do usuário funciona um pouco diferente, então você já usou

 .state('projectsWs.tasks.detail', { url: "/:taskId", views: { "mainView@": { templateUrl: "/app/projects/templates/index.php" }, // this won't work, because the part after @ // must be state name "innerView@mainView": { // so we would need this to target root, index.html "innerView@": { // or this to target nested view inside of a parent "innerView": { // which is the same as this "innerView@projectsWs.tasks": { 

Verifica a:

Exibir nomes – relativos versus nomes absolutos

pequena citação:

Nos bastidores, cada view recebe um nome absoluto que segue um esquema de viewname@statename , onde viewname é o nome usado na diretiva view e state name é o nome absoluto do estado, por exemplo, contact.item. Você também pode optar por escrever seus nomes de exibição na syntax absoluta.

Eu criei um exemplo de trabalho aqui , e os estados são assim

 $stateProvider .state('projectsWs', { template: '
' + '
', }) $stateProvider .state('projectsWs.tasks', { url: "/tasks", views: { "mainView": { //templateUrl: "/app/projects/templates/index.php" template: "
main view tasks
", }, "innerView": { //templateUrl: "/app/projects/templates/tasks.php", template: "
inner view tasks
", } } }) .state('projectsWs.tasks.detail', { url: "/:taskId", views: { "mainView@projectsWs": { //templateUrl: "/app/projects/templates/index.php" template: "
main view task {{$stateParams | json }}
", }, "innerView@projectsWs": { //templateUrl: "/app/projects/templates/tasks.php", template: "
inner view task {{$stateParams | json }}
", } } });

O que podemos ver é que o grand progenitor projectsWs está injetando em index.html (root)

algum template, com duas âncoras nomeadas:

 template: '
' + '
',

isto é usado então em estados da lista e do detalhe, com nomes resp relativos e absolutos

Confira aqui em ação