【问题标题】:How to create nested state dynamically based on $stateParams in angular UI-Router如何基于角度 UI-Router 中的 $stateParams 动态创建嵌套状态
【发布时间】:2015-05-24 01:33:42
【问题描述】:

我想根据传递的状态参数创建子状态(嵌套状态)。

例如我有一个动态参数,'pageId'。如果$stateparams.pageId'page2',那么我想为此创建两个嵌套状态。

我该怎么做?提前致谢。

这是为此创建的 plunkr

Plnkr

app.config(['$stateProvider', '$urlRouterProvider',
    function($stateProvider, $urlRouterProvider){
        $stateProvider.state('page', {
            url: '/:pageId',
            templateUrl: function($stateParams){
              return $stateParams.pageId +".tpl.html";
            }
        });

        $urlRouterProvider.otherwise('/page1');
    }]);

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    a working plunker

    我们可以创建两个状态。一个不会使用嵌套视图,第二个会有它们。

    // state without nested
    .state('pageWithout', {
      url: '/{pageId:(?:page1|page3|page5)}',
      templateUrl: "page1.tpl.html",
    })
    // state with nested
    .state('pageWith', {
      url: '/:pageId',
      views : {
        '' : {
          templateUrl: "page2.tpl.html",
        },
        '@pageWith' : {
          template: "<h2>the SECOND content for state with nested views</h2",
        }
      }
    });
    

    因此,诀窍是使用某种模式来说明哪些 pageId 值应该进入第一个状态。检查

    UrlMatcher

    负责url : 'url def...'处理

    这样我们就可以将相似的链接翻译成不同的状态,具有不同的嵌套视图结构:

    // without nested views
    <a href="#/page1">
    <a href="#/page3">
    <a href="#/page5">
    
    // with nested views
    <a href="#/page2">
    <a href="#/pageA">
    <a href="#/pageB">
    

    查看it here

    EXEND,带有子状态和一些默认值。 udpated plunker

    所以,我们可以创建第二个状态的几个子节点:

    // children
    .state('pageWith.defaultChild', {
      url: '/default',
      views : { 
        '' : {
          template: "<h3>the pageWith.defaultChild </h3",
        }
      }
    }) 
    .state('pageWith.childWithParams', {
      url: '/{id:int}',
      views : {
        '' : {
          template: "<h3>the child with ID param {{$stateParams.id}} </h3",
        }
      }
    });
    

    基于此解决方案:

    Redirect a state to default substate with UI-Router in AngularJS

    我们可以用 redirectTo

    来装饰我们的父状态
    .state('pageWith', {
      url: '/:pageId',
      redirectTo: 'pageWith.defaultChild',
      ...
    

    只需添加这个简单的监听器

    .run(['$rootScope', '$state', function($rootScope, $state) {
    
        $rootScope.$on('$stateChangeStart', function(evt, to, params) {
          if (to.redirectTo) {
            evt.preventDefault();
            $state.go(to.redirectTo, params)
          }
        });
    }]);
    

    勾选默认state redirect here

    【讨论】:

    • 我喜欢这个使用 UrlMatcher 的想法。但是,在这里,当您使用模板指定“@pageWith”时,您不是在创建子状态吗?假设我想为 page2 创建两个子状态,其中一个子状态是默认状态。我们如何处理这种情况?而且,如果我想导航到任何特定的子状态?
    • 我们真的很亲密,给我秒
    • 所以,在更新的答案中,我给了你更新的 plunker 并添加了一个指向更详细答案的链接......现在你应该拥有这一切,开始从强大的 UI-Router 中获利;)跨度>
    • 我忘记更新插件了!有最新正确的链接plnkr.co/edit/d4iTnQaPTgXtLWnDB7PW?p=preview
    • 超级。这就是我想要的。非常感谢。我没有得到一份。 '/{id:int}' 你能解释一下这个部分吗?
    【解决方案2】:

    我不确定是否清楚地了解您要做什么,这是您要做什么吗?

    app.config(['$stateProvider', '$urlRouterProvider',
    function($stateProvider, $urlRouterProvider){
        $stateProvider
            .state('page', {
                url: '/:pageId',
                templateUrl: function($stateParams){
                    return $stateParams.pageId +".tpl.html";
                },
            });
            .state('page.firstchild', {
                url: '/foo', // will have url /:pageId/foo because it inherits from its parent
            })
            .state('page.secondchild', {
                url: '/bar' // same here
            })
    
        $urlRouterProvider.otherwise('/page1');
    }]);
    

    【讨论】:

    • 在这种情况下,它每次都会创建 firstChild 和 secondChild 状态,而不考虑传递的 pageId 对吗?我只想为 page2 创建子状态。在 page2.tpl.html 中,我放置了一个 ui 视图,因为我想要一个子状态。但是在 page1.tpl.html 中,我不想要这些子状态。因此,即使我在 page1.tpl.html 中放置了一个 ui-view,它也不应该起作用。假设我每个页面都有单独的模块本身。所以我只想在 page2 模块的配置中创建这些状态。希望我说清楚了。
    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多