Angularjs 通过ui路由器中的嵌套状态漫游而不重新加载父状态
在我的项目中,有许多组织。每个组织页面包含两部分:包含一些组织信息的标题(只能加载一次)和区域选项卡。对于选项卡,我使用嵌套状态 现在问题:我可以在不重新加载organizationCtrl的情况下浏览选项卡吗 路由器.jsAngularjs 通过ui路由器中的嵌套状态漫游而不重新加载父状态,angularjs,angular-ui-router,Angularjs,Angular Ui Router,在我的项目中,有许多组织。每个组织页面包含两部分:包含一些组织信息的标题(只能加载一次)和区域选项卡。对于选项卡,我使用嵌套状态 现在问题:我可以在不重新加载organizationCtrl的情况下浏览选项卡吗 路由器.js $stateProvider .state('organization', { url: '/organisations/:id', templateUrl: 'organization/show.html', con
$stateProvider
.state('organization', {
url: '/organisations/:id',
templateUrl: 'organization/show.html',
controller: 'organizationCtrl'
})
.state('organization.bio', {
url: '/bio',
templateUrl: 'organization/bio.html',
controller: 'organizationBioCtrl'
})
.state('organization.bio', {
url: '/gallery',
templateUrl: 'organization/gallery.html',
controller: 'organizationGalleryCtrl'
});
组织/show.html
<ul>
<li ui-sref-active="selected">
<a ui-sref="organization.bio({ id: organization.id })">Bio</a>
</li>
<li ui-sref-active="selected">
<a ui-sref="organization.gallery({ id: organization.id })">Gallery</a>
</li>
</ul>
-
生物
-
画廊
即使某些状态参数发生更改,也会触发状态更改。因此,在我们的用户在同一组织的bio和gallery之间导航之前,{id}
-不会重新加载organizationCtrl
。当用户将导航到不同的组织时,{id}
。。。新的状态更改将被触发,新的organiaztionCtrl
将起作用
但我们可以解决它。这是一张工作票
我们将组织状态分为2个(家长/孩子)。一个是组织的基础/根,不依赖于具体的组织{id}。这意味着-将只实例化一次
.state('base', {
abstract : true,
template: '<div ui-view=""></div>',
controller: 'baseCtrl'
})
.state('organization', {
parent : 'base',
url: '/organisations/:id',
controller: 'organizationCtrl'
...
})
.state('organization.bio', {
url: '/bio',
...
})
.state('organization.gallery', {
url: '/gallery',
...
});
因为基本状态是抽象的,所以它不会在当前模型中引入任何内容,我们只获得baseCtrl
请注意本作品中描述的行为,但由于某些原因,当我在同一组织的bio和gallery之间导航时{id},我的组织Ctrl有时会无规律地重新加载。这是我的组织Ctrl:
$scope.organization=$resource('/api/organizations/:id.json').get({id:$stateParams.organizationId})代码>我在嵌套控制器中使用它。我将为您的创建一个Plunk,以演示上述解决方案的工作原理。但有一点是清楚的:如果调用了organizationCtrl
,这意味着状态更改被触发,至少id被更改。另一种可能是调用了$state.reload(),但这是我不期望的。。。将在plunker中向您展示(一旦plnkr.co再次启动),谢谢!只是不明白这句话。即使某些状态参数发生更改,也会触发状态更改。
。我撒了一点谎。。。在我的路由中,我有额外的状态参数,如url:'/gallery?date'
(忽略此项),并且参数日期已更改<代码>组织控制器
仍然重新加载,但这是另一个问题:)谢谢!如果参数属于某个嵌套状态(库),则这应该是确定的。但我想说的是:如果我们将位于/organizations/1/bio',那么更改为/organizations/2就足以触发组织状态级别的状态更改。提供在state===不同状态中定义的不同参数是触发的。我已经添加了一个到plunker的链接,您可以在这里观察我们讨论的内容。享受ui路由器
<ul>
<li><a ui-sref="organization.bio( { id: 1 })">Orga1 - Bio</a></li>
<li><a ui-sref="organization.gallery({ id: 1 })">Orga1 - Gallery</a></li>
<li><a ui-sref="organization.bio( { id: 2 })">Orga2 - Bio</a></li>
<li><a ui-sref="organization.gallery({ id: 2 })">Orga2 - Gallery</a></li>
</ul>
.controller('baseCtrl', function($scope,...) {
// pretty stable one
})
.controller('organizationCtrl', function($scope, ...) {
// changing with id change
})