gpt4 book ai didi

angularjs - 带有 ui-router 的嵌套 Angular 状态中的不同布局?

转载 作者:行者123 更新时间:2023-12-01 11:38:37 25 4
gpt4 key购买 nike

我的应用程序有四种逻辑状态:

pages.list      (lists pages)
pages.create (create a new page)
pages.item (show a single page)
pages.item.edit (edit a single page)

状态 pages.listpages.item 共享一个基本模板(传统的三列布局),但是状态 pages.createpages.item.edit 有一个完全不同的模板(整页编辑器)。

用 ui-router 表达这个的最佳方式是什么?

最佳答案

我会说使用抽象状态是可行的方法。在 documentation ,它们清楚地概述了好处,其中一些非常适合您的用例(强调我的):

Some examples of how you might use an abstract state are:

  • To prepend a url to all child state urls.
  • To insert a template with its own ui-view(s) that its child states will populate.
    • Optionally assign a controller to the template. The controller must pair to a template.
    • Additionally, inherit $scope objects down to children, just understand that this happens via the view hierarchy, not the state hierarchy.
  • To provide resolved dependencies via resolve for use by child states.
  • To provide inherited custom data via data for use by child states or an event listener.
  • To run an onEnter or onExit function that may modify the application in someway.
  • Any combination of the above.

有了这种理解,您的应用可以按如下方式构建:


第一步

创建两个您的页面可以使用的模板。我们称它们为 three_columns.htmlone_column.html。对于 3 列布局,请确保相应地命名您的 ui-view:

<!-- three_columns snippet -->
...
<body>
<div ui-view="left"></div>
<div ui-view="middle"></div>
<div ui-view="right"></div>
</body>

然后,单列模板:

<!-- one_column snippet -->
...
<body>
<div ui-view></div>
</body>

第 2 步

声明两个抽象状态。我们称它们为 oneColthreeCols。请注意,由于它们都声明了 url: '/pages',因此所有继承的子状态都会将 /pages 自动添加到它们自己的 URL 之前。

$stateProvider
.state('oneCol', {
abstract: true,
url: '/pages',
templateUrl: 'layouts/one_column.html'
}).state('threeCols', {
abstract: true,
url: '/pages',
templateUrl: 'layouts/three_columns.html'
});

第 3 步

声明你的状态,它扩展了上面的抽象状态。假设我们称它们为 listcreateviewedit。在这里,threeCols.listthreeCols.view 必须声明 3 个 templateUrl,每个名为 ui-view。另一方面,oneCol.createoneCol.edit 将正常声明其未命名的 templateUrl。我通常使用的约定是为每个状态创建一个特定的文件夹,因为它有利于组织 subview 模板:

$stateProvider
.state('threeCols.list', {
url: '/list',
controller: 'ListCtrl',
views: {
'left': {
templateUrl: 'modules/list/leftbar.html'
},
'middle': {
templateUrl: 'modules/list/content.html'
},
'right': {
templateUrl: 'modules/list/rightbar.html'
}
}
}).state('oneCol.create', {
url: '/create',
controller: 'CreateCtrl',
templateUrl: 'modules/create/content.html'
}).state('threeCols.view', {
url: '/view',
controller: 'ViewCtrl',
views: {
'left': {
templateUrl: 'modules/view/leftbar.html'
},
'middle': {
templateUrl: 'modules/view/content.html'
},
'right': {
templateUrl: 'modules/view/rightbar.html'
}
}
}).state('oneCol.edit', {
url: '/edit',
controller: 'EditCtrl',
templateUrl: 'modules/edit/content.html'
});

有了这个,现在您的 URL 将看起来像您期望的那样:/pages/list/pages/create/pages/view/pages/edit。您还可以根据需要创建和重复使用模板。

关于angularjs - 带有 ui-router 的嵌套 Angular 状态中的不同布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24565007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com