Angularjs 是否可以替换/覆盖ui路由器状态定义?(默认状态为另一个模块“自定义”)

Angularjs 是否可以替换/覆盖ui路由器状态定义?(默认状态为另一个模块“自定义”),angularjs,angular-ui-router,Angularjs,Angular Ui Router,有没有可能简单地用一个新的定义替换一个州的定义 我的用例是一个模块定义状态,我希望能够从另一个模块替换该状态定义。基本上,初始定义是一个“默认”定义,我希望能够从不同的模块自定义状态 我意识到在配置时这样做可能会导致模块首先定义它的竞争条件。我研究了在运行时执行此操作的可能性,但无法使其正常工作 我可以通过创建全新的状态来完成我想要的,但是我希望使用原始状态中的相同URL 编辑: angular.module('module1', ['ui.router']) .config(['$stateP

有没有可能简单地用一个新的定义替换一个州的定义

我的用例是一个模块定义状态,我希望能够从另一个模块替换该状态定义。基本上,初始定义是一个“默认”定义,我希望能够从不同的模块自定义状态

我意识到在配置时这样做可能会导致模块首先定义它的竞争条件。我研究了在运行时执行此操作的可能性,但无法使其正常工作

我可以通过创建全新的状态来完成我想要的,但是我希望使用原始状态中的相同URL

编辑:

angular.module('module1', ['ui.router'])
.config(['$stateProvider', function($stateProvider){
    $stateProvider
        .state('root', {
            url: '',
            abstract: true,
            template: '<div class="layout sub" ui-view="sub"></div>'
        })
        .state('root.sub1', {
            url: '/sub1',
            views: {
            }
        });
}]);

angular.module('module2', ['ui.router'])
.run(['$state', function($state){
    var state = $state.get('root.sub1');
    if(state && state.views){
        state.views['sub@root'] = { template: '<p>Customized sub state 1</p>' };
    }
}]);
为了进一步阐明我正在努力实现的目标。。。 请考虑以下代码:

angular.module('module1', ['ui.router'])
.config(['$stateProvider', function($stateProvider){
    $stateProvider
        .state('root', {
            url: '',
            abstract: true,
            template: '<div class="layout sub" ui-view="sub"></div>'
        })
        .state('root.sub1', {
            url: '/sub1',
            views: {
                'sub@root': {
                    template: '<p>Default sub state 1</p>'
                }
            }
        });
}]);

angular.module('module2', ['ui.router'])
.config(['$stateProvider', function($stateProvider){
    $stateProvider
        .state('root.sub1', {
            url: '/sub2',
            views: {
                'sub@root': {
                    template: '<p>Customized sub state 1</p>'
                }
            }
        });
}]);
angular.module('module1',['ui.router']))
.config(['$stateProvider',函数($stateProvider){
$stateProvider
.state('根'{
url:“”,
摘要:没错,
模板:“”
})
.state('root.sub1'{
url:“/sub1”,
观点:{
'sub@root': {
模板:“默认子状态1

” } } }); }]); 角度.module('module2',['ui.router'])) .config(['$stateProvider',函数($stateProvider){ $stateProvider .state('root.sub1'{ url:“/sub2”, 观点:{ 'sub@root': { 模板:“自定义子状态1

” } } }); }]);

这当然会给出“错误:状态‘root.sub1’已定义”

我发现解决此问题的最佳方法是:

  • 创建“根”控制器(即在其他状态之前加载的状态)
  • .state('root',{url:':/root_path',controller:'rootController'…此处的其他内容})

  • 在rootController中,您可以决定如何处理路由:
  • 调用(从数据库中提取根键)。然后(函数(根响应){ if(root_response.type==“用户”){ $state.go(“user.dashboard”)})


    很抱歉设置格式,我是移动的:)

    好的,所以当我准备下一步尝试的plnkr演示时,我发现如果使用$state.get并更新它,它实际上是有效的

    angular.module('module2', ['ui.router'])
    .run(['$state', function($state){
      var state = $state.get('root.sub1');
      if(state && state.views && state.views['sub@root']){
        state.views['sub@root'].template = '<p>Customized sub state 1</p>';
      }
    }]);
    
    angular.module('module2',['ui.router']))
    .run(['$state',函数($state){
    var state=$state.get('root.sub1');
    if(state&&state.views&&state.views['sub@root']){
    陈述意见sub@root'].template='自定义子状态1

    '; } }]);
    Plnkr:

    编辑:

    angular.module('module1', ['ui.router'])
    .config(['$stateProvider', function($stateProvider){
        $stateProvider
            .state('root', {
                url: '',
                abstract: true,
                template: '<div class="layout sub" ui-view="sub"></div>'
            })
            .state('root.sub1', {
                url: '/sub1',
                views: {
                }
            });
    }]);
    
    angular.module('module2', ['ui.router'])
    .run(['$state', function($state){
        var state = $state.get('root.sub1');
        if(state && state.views){
            state.views['sub@root'] = { template: '<p>Customized sub state 1</p>' };
        }
    }]);
    
    我发现它在我的应用程序中不起作用,因为我没有定义要在原始状态下覆盖的视图

    示例(不起作用):

    angular.module('module1', ['ui.router'])
    .config(['$stateProvider', function($stateProvider){
        $stateProvider
            .state('root', {
                url: '',
                abstract: true,
                template: '<div class="layout sub" ui-view="sub"></div>'
            })
            .state('root.sub1', {
                url: '/sub1',
                views: {
                }
            });
    }]);
    
    angular.module('module2', ['ui.router'])
    .run(['$state', function($state){
        var state = $state.get('root.sub1');
        if(state && state.views){
            state.views['sub@root'] = { template: '<p>Customized sub state 1</p>' };
        }
    }]);
    
    angular.module('module1',['ui.router']))
    .config(['$stateProvider',函数($stateProvider){
    $stateProvider
    .state('根'{
    url:“”,
    摘要:没错,
    模板:“”
    })
    .state('root.sub1'{
    url:“/sub1”,
    观点:{
    }
    });
    }]);
    角度.module('module2',['ui.router']))
    .run(['$state',函数($state){
    var state=$state.get('root.sub1');
    if(state&&state.views){
    陈述意见sub@root']={模板:'自定义子状态1

    '}; } }]);
    似乎无法为 对于v1,有一个新的方法用于该目的

    我尝试使用$state.get(view)并覆盖该值,但控制器和模板未正确注册,因为内置装饰器正在使用stateBuilder属性生成控制器和模板


    检查

    您可能可以通过使用抽象父状态来获取。在这种情况下,您可以使用相同的URL。您是否可以详细说明您正试图执行的操作?因此,现在我想知道是否有一种方法可以使此工作正常,以便通过$state.get添加新的视图定义将生效。。。