Angularjs ui-router no llega al controlador infantil

Tengo una función de configuración:

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); } } } });} 

InnerView está dentro de mainView. Cuando tengo url like /projects-ws/tasks , la función tasksCtrl funciona como se esperaba. Pero cuando tengo url con una identificación, es decir, /projects-ws/tasks/32 , no veo ningún resultado, pero espero salida de innerViewCtrl , ese es el problema que tengo. Creo que tengo un problema con las vistas absolutas / relativas, pero ya he probado todas las combinaciones y todavía no funciona.

ACTUALIZACIÓN: Así que ahora tengo el siguiente 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 dijo Radim Köhler. mainViewctrl Object {taskId: "32"} , pero ¿cómo puedo llegar a $stateParams.taskId desde innerView ahora?

La asignación de nombres absoluta con UI-Router funciona de manera un poco diferente de lo que has usado

 .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": { 

Comprobar el:

Ver nombres – Nombres relativos vs. absolutos

pequeña cita:

Detrás de escena, a cada vista se le asigna un nombre absoluto que sigue un esquema de viewname@statename , donde viewname es el nombre utilizado en la directiva view y el nombre de estado es el nombre absoluto del estado, por ejemplo, contact.item. También puede optar por escribir sus nombres de vista en la syntax absoluta.

Creé un ejemplo de trabajo aquí , y los estados son así

 $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 }}
", } } });

Lo que podemos ver es que el gran padre projectsWs está inyectando en index.html (root)

alguna plantilla, con dos anclajes nombrados:

 template: '
' + '
',

esto se usa luego en los estados de lista y detalle, con nombres abs juntos y relativos

Verifíquelo aquí en acción