Angular嵌套资源数据

时间:2015-07-23 20:49:18

标签: angularjs angular-ui-router

我有以下代码:

//routes
.state('app.parent', {
  url: '/parent',
  templateUrl: 'parent.html',
  controller: 'ParentCtrl'
})
.state('app.parent.child', {
  url: '/child',
  controller: 'ChildCtrl',
  templateUrl: 'child.html',
})


//controllers
.controller('ParentCtrl', ['$scope', 'SomeResource', function ($scope, SomeResource) {
  $scope.resources = [];
  
  SomeResource.query({}, function(data) {
    $scope.resources = data;
  });
}])
.controller('ChildCtrl', ['$scope', 'OtherResource', function ($scope, OtherResource) {
  $scope.other = {};
  ...
}])
<!-- VIEWSs -->
<!-- parent.html -->
...
<div ui-view>
  <table class="table table-hover table-striped">
    <tbody>
      <tr ng-repeat="resource in resources">
        ...
      </tr>
    </tbody>
  </table>
</div>

<!-- child.html -->
<div class="form">
	...
</div>

以及其他一些嵌套状态。

问题是当我访问“父”的任何“子”状态时,父控制器显然总是被执行,因此每个子状态都会调用 SomeResource.query

我需要 查询 仅针对父级而不是任何子级状态,并且需要嵌套。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

根据angular-ui docs

  

当应用程序处于特定状态时 - 当状态为&#34;活动&#34; - 其所有祖先状态也是隐式活动状态。下面,当&#34; contacts.list&#34;国家是活跃的,&#34;联系人&#34; state也是隐式活动的,因为它是&#34; contacts.list&#34;的父状态。

这意味着如果您在访问子项时不需要父项处于活动状态,请不要使用嵌套。 (您的URL结构也缺少嵌套,这可能是您在州结构中不需要它的标志。)

如果您确实想要出于其他原因嵌套状态,并且您只是想避免运行多次的昂贵查询,那么您可能希望重构SomeResource实现。例如,您可以在该服务中添加一些缓存,以便重复调用query()不会导致开销。