Angularjs 通过ui路由器中的嵌套状态漫游而不重新加载父状态

Angularjs 通过ui路由器中的嵌套状态漫游而不重新加载父状态,angularjs,angular-ui-router,Angularjs,Angular Ui Router,在我的项目中,有许多组织。每个组织页面包含两部分:包含一些组织信息的标题(只能加载一次)和区域选项卡。对于选项卡,我使用嵌套状态 现在问题:我可以在不重新加载organizationCtrl的情况下浏览选项卡吗 路由器.js $stateProvider .state('organization', { url: '/organisations/:id', templateUrl: 'organization/show.html', con

在我的项目中,有许多组织。每个组织页面包含两部分:包含一些组织信息的标题(只能加载一次)和区域选项卡。对于选项卡,我使用嵌套状态

现在问题:我可以在不重新加载organizationCtrl的情况下浏览选项卡吗

路由器.js

$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
})