【问题标题】:Angular + ui-router implementing tabsAngular + ui-router 实现选项卡
【发布时间】:2014-09-25 09:59:54
【问题描述】:

在过去的 9 个小时里,我一直在尝试使用 Angular 和 ui-router 实现一个带有标签的页面。

我有以下:

.state('someAbstractParentRoot', {
            'abstract': true,
            url: '/{id}',
            templateUrl: '/admin/templates/rootTemplate',
            controller: 'someController1',
            data: {
                breadcrumbLabel: 'Details'
            }
        })
        .state(someAbstractParentRoot.child, {
            url: '',
            views: {
                details: {
                    templateUrl: '/admin/templates/details',
                    controller: 'someController2'
                },
                videos: {
                    templateUrl: '/admin/templates/videos',
                    controller: 'someController3'
                },
                logs: {
                    templateUrl: '/admin/templates/logs',
                    controller: 'someController4',
                },
                notes: {
                    templateUrl: '/admin/templates/notes',
                    controller: 'someController5'
                }
            }
        })

使用引导程序,我只需显示我需要的模板。
因此,当显示视频选项卡时,网址类似于:localhost:8080/users/1#videos。 所以,这一切都很好,直到我需要将此链接发送给某人,因为当我这样做时,详细信息选项卡会自动打开。我不能只在 div 元素上切换类,因为一些选项卡正在使用 ng-if,所以 jquery 没有拾取它应该获取的所有 html,可能是因为 angulars 摘要循环(它可以用 setTimeout 解决,但我我试图避免这种情况)。

有谁知道我如何使用 ui-router 来定义一个支持直接链接的选项卡? 一些例子将不胜感激。 注意:我需要抽象的父状态。

ui-router中的url可以有'#'符号吗?

【问题讨论】:

  • 对于抽象男性 url "/tabs" 和对于 chols state "/:id"
  • 也看看我为其他主题制作的标签的实现。 jsfiddle.net/Serhioromano/t7s3jrg4
  • 谢谢,这给了我一个想法。这可能是一个愚蠢的问题,但是更改 url 中的参数会触发页面重新加载,不是吗?
  • 没有。 Angular 是 SPA,页面只加载一次。它只会加载选项卡的部分内容,并且只会加载一次。并且您在 paranet 抽象范围中定义的所有 $scope 都会被记住。您可以在输入中输入文本,然后切换选项卡,您可以看到文本在那里。

标签: angularjs tabs angular-ui-router


【解决方案1】:

你的状态有问题 实际上你只声明一个状态,它可以分成几个部分你必须为每个子视图声明一个状态,所以声明类似的东西。我不知道你是否真的需要一个抽象状态,所以我可以声明:

    $stateProvider.state('details', {
        templateUrl: '/admin/templates/details',
        controller: 'someController2'
    })
    .state('videos', {
         templateUrl: '/admin/templates/details.html',
         controller: 'someController3'
    })
    .state('logs', {
         templateUrl: '/admin/templates/logs.html',
         controller: 'someController4'
    })            
    .state('notes', {
         templateUrl: '/admin/templates/notes.html',
         controller: 'someController5'
    });

在你的 rootTemplate 中添加这个

   <div id="tabsContainer">
       <a ui-sref="details">Details</a>
       <a ui-sref="logs">Logs</a>
      ....
   </div>

   <div ui-view> </div> <!-- Where your state template will be inserted -->

【讨论】:

  • 是的,我也看到了这个问题,我的一个想法是将一个有 4 个视图的状态拆分为 4 个状态,但是,老板希望能够手动更改 url 而无需重新加载页面。所以,最后我保持原样,那些'a'标签对带有一些id的元素有一个href(例如)并包装了$location.hash()进入一个函数并使用 watch 来检测哈希何时更改并使用大量 ng-classes 来确定应该打开哪个选项卡....
  • 没有状态,它对所有状态都可用,就像一个永远不会改变的主模板。
  • @Marin 用于检测状态变化使用 $stateChangeSuccess 事件
  • 我认为这不符合项目中事物排列方式的要求。因为,这些选项卡仅在您从主菜单导航到的一个子页面上可用,并且该子页面必须具有与其他所有页面一样定义的状态。这有意义吗?
  • 好的,定义你的主状态'main'并查看一个
    并定义一个模板,该模板将包含你的选项卡和关联的视图,然后创建名为'main'的子状态。 XXX',因此您可以通过标签更改子状态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2016-07-02
  • 2013-09-17
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多