Angular UI-Router如何创建"布局"状态?

CMC*_*kai 38 angularjs angular-ui-router

给定一个像这样的HTML文件:

<html>
<header ui-view="header"></header>
<div class="main" ui-view></div>
<footer ui-view="footer"></footer>
</html>
Run Code Online (Sandbox Code Playgroud)

如何创建一个布局状态,用标题模板填充"标题",页脚带有页脚模板,然后允许子状态填充空的ui视图?

我想空的ui-view也可以命名为ui-view ="main".

jac*_*per 78

试试这个,几乎你的页眉和页脚是静态模板,但你可以添加控制器,以防你需要添加一些动态功能,默认情况下将包含页眉和页脚,因为路线是'',所以试试看:

 app.config(['$stateProvider', function($stateProvider){
        $stateProvider
        .state('root',{
          url: '',
          abstract: true,
          views: {
            'header': {
              templateUrl: 'header.html',
              controller: 'HeaderCtrl'
            },
            'footer':{
              templateUrl: 'footer.html',
              controller: 'FooterCtrl'
            }
          }
        })
        .state('root.home', {
          url: '/',
          views: {
            'container@': {
              templateUrl: 'homePage.html'
            }
          }
        })
        .state('root.other', {
          url: '/other',
          views: {
            'container@': {
              templateUrl: 'other.html'
            }
          }
        });    

    }]);
Run Code Online (Sandbox Code Playgroud)

编辑: 对我来说,设置视图的最佳位置应该在index.html中,如下代码:

<header>
    <div ui-view="header"></div>
</header>
<div ui-view="container">
</div>
<footer id="mainFooter" ui-view="footer">
</footer>
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案.它以一种干净的方式解决了这个问题. (6认同)
  • @Tsalikidis在这里查看多个命名视图https://github.com/angular-ui/ui-router/wiki/Multiple-Named-Views (2认同)

小智 32

一种方法是建立全球"根"状态.所以,每个州都将是它的孩子.像root.pages,root.pages.edit,root.settings等.然后你可以提供页眉和页脚的默认模板.

另一种方法,我个人使用的不同方法是ng-include用于页眉和页脚.

<body ng-controller="AppCtrl">
  <div id="header" ng-include="'header.tpl.html'"></div>
  <div class="main_container" ui-view>
  </div>
</body>
Run Code Online (Sandbox Code Playgroud)

顺便说一句.我在header.tpl.html中使用单独的控制器,这是主AppCtrl的一个孩子:

<div id="header" ng-controller="HeaderCtrl"> ....
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的主意."布局"或"根"状态有用的原因是当您在应用内部时,您的"标题"或"页脚"可能会发生变化.如内部帐户管理与外部演示网站之间.虽然在这个root状态下,它是一个抽象状态,我猜它没有url属性吗?(我也喜欢AppCtrl,我一直在使用app.run(function(){})作为根控制器. (2认同)
  • 你不知道我读了多少关于嵌套视图,命名视图/页面,ui-router教程等的页面......在你的帖子让我意识到一个简单的ng-include会做得很好.谢谢你,你有效地在我的头和它正在撞击的墙壁之间放了一个枕头. (2认同)

M K*_*M K 21

实际上有一种非常简单的方法可以做到这一点.

1.创建布局状态

$stateProvider
  .state('master', {
    abstract: true,
    views: {
      layout: {
        templateUrl: '/layouts/master.html',
      }
    }
  });
Run Code Online (Sandbox Code Playgroud)

2.在布局中使用未命名的视图状态

<!-- layouts/master.html -->
<div ui-view></div>
Run Code Online (Sandbox Code Playgroud)

3.创建视图状态

$stateProvider
  .state('home', {
    url: '/',
    templateUrl: '/views/home.html',
    parent: 'master',
  });
Run Code Online (Sandbox Code Playgroud)

4.使用命名布局状态作为根状态

<!-- home.html -->
<body ui-view="layout"></body>
Run Code Online (Sandbox Code Playgroud)