AngularJS ui 子状态路由的路由器问题

AngularJS ui router problems with substate routing

真的不知道这里发生了什么,我以前做过这件事数百万次。

即使路由与子状态匹配,以下配置也会导致 root state 被执行。

module.config(['$stateProvider', function($stateProvider) {
    $stateProvider.state('apps-neo',{
        url: '/apps/neo/',
        template: '<a ui-sref="apps-neo.a({id: 1})">test</a>',
        controller: function(){
            console.log('parent controller')
        },
        navbar: 'apps'
    }).state('apps-neo.a',{
        url: 'a/:id',
        template: 'a',
        controller: function($stateParams){
            console.log($stateParams.id)
        },
        navbar: 'apps'
    });
}

案例 1 GET /apps/neo/

我激活了父状态,这是正确的。控制台记录 parent controller 并且视图显示 test link.

案例二GET /apps/neo/a/1

我仍然激活父状态,这很奇怪。控制台记录 parent controller 并且视图显示 test link.


如果我更改为以下内容,基本上删除状态层次结构,一切都会按预期进行。

module.config(['$stateProvider', function($stateProvider) {
    $stateProvider.state('apps-neo',{
        url: '/apps/neo/',
        template: '<a ui-sref="apps-neo.a({id: 1})">test</a>',
        controller: function(){
            console.log('parent controller')
        },
        navbar: 'apps'
    }).state('apps-neo-a',{ // <------ do not make this state nest from previous
        url: '/apps/neo/a/:id',
        template: 'a',
        controller: function($stateParams){
            console.log($stateParams.id)
        },
        navbar: 'apps'
    });
}

案例一GET /apps/neo/

我激活了 apps-neo 状态,这是正确的。控制台日志 父控制器.

案例二GET /apps/neo/a/1

我激活了 apps-neo-a 状态,这是正确的。控制台记录 1 并且视图显示 a.


有什么想法吗?

您应该在父状态中添加另一个 ui-view,以便呈现嵌套状态。

例如:

template: `<a ui-sref="apps-neo.a({id: 1})">test</a>
           <hr/>
           <div ui-view></div>`,

问题是您没有在父模板中声明 ui-view。

当应用程序处于特定状态时(当状态为 "active" 时),其所有祖先状态也隐含地处于活动状态。

子状态会将其模板加载到其父状态的 ui 视图中。

在此处输入代码

module.config(['$stateProvider', function($stateProvider) {
$stateProvider.state('apps-neo',{
    url: '/apps/neo/',
    template: '<a ui-sref="apps-neo.a({id: 1})">test</a><div ui-view</div>',
    controller: function(){
        console.log('parent controller')
    },
    navbar: 'apps'
}).state('apps-neo-a',{ // <------ do not make this state nest from previous
    url: 'a/:id',
    template: 'a',
    controller: function($stateParams){
        console.log($stateParams.id)
    },
    navbar: 'apps'
});

}