Angularjs ui-router没有到达子控制器

我有一个configurationfunction:

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在mainView中。 当我得到像/projects-ws/tasks这样的url时, tasksCtrl函数按预期工作。 但是,当我有一个ID的url,即/projects-ws/tasks/32 ,我没有看到任何输出,但我期望innerViewCtrl输出,这就是我得到的问题。 我认为我有一个绝对/相对的意见,但我已经尝试了所有组合,但仍然无法正常工作。

更新:所以现在我有以下状态:

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

正如RadimKöhler所说。 它输出mainViewctrl Object {taskId: "32"} ,但我$stateParams.taskId能从innerView$stateParams.taskId

用UI-Router进行绝对命名的工作有点不同,那么你已经使用它了

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

检查:

查看名称 – 相对与绝对名称

小引用:

在幕后,每个视图都被分配了一个绝对名称,该名称遵循viewname@statenamescheme,其中viewname是view指令中使用的名称,state名称是状态的绝对名称,例如contact.item。 您也可以select以绝对语法编写视图名称。

我在这里创造了一个工作的例子 ,各州是这样的

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

我们可以看到的是,盛大的父projectsWs正在注入到index.html(root) <div ui-view="">一些模板中,并带有两个命名锚:

 template: '<div ui-view="mainView" ></div>' + '<div ui-view="innerView" ></div>', 

然后在列表和详细状态中使用它们,并使用相对的绝对名称

在这里检查它的行动