如何使用ngResource处理3级深层嵌套资源?

时间:2014-02-06 17:43:15

标签: angularjs angular-resource

我正在研究我的第一个AngularJS应用程序,以便学习该框架。

我目前正在寻找一种能够处理嵌套资源的惯用方法。

我的区域包含建筑物,其中包含平面。一个 flat 只在一个建筑物内部,只在一个区域内转入

在我的数据库模型中,我不需要将区域ID flat 对象一起存储,其父级(建筑ID )是够了。

下面是我写的一个最小例子来说明这个概念。我的观点基于我在Google I / O视频中看到的内容:http://www.youtube.com/watch?v=HCR7i5F5L8c

我的问题是:如何实例化特定的 Flat 资源?我拥有URL中所需的所有信息,但它并不严格对应我的模型(区域ID 缺失)。

var app = angular.module('neighborhoodApp', [
  'ngResource',
  'ngRoute'
]);

angular.module('neighborhoodApp')
  .factory('Area', function ($resource) {
    return $resource('/areas/:id', {
      'id': '@_id'
    });
  });

angular.module('neighborhoodApp')
  .factory('Building', function ($resource) {
    return $resource('/areas/:aid/buildings/:id', {
      'id': '@_id',
      'aid': '@area_id'
    });
  });

angular.module('neighborhoodApp')
  .factory('Flat', function ($resource) {
    return $resource('/areas/:aid/buildings/:id/flats/:id', {
      'id': '@_id',
      'bid': '@building_id'
      // 'aid': '@area_id' => my model doesn't have an area id, having a building id attached to a flat is enough to find the area
    });
  });

angular.module('neighborhoodApp')
  .controller('AreaListCtrl', function (Area) {
    this.areas = Area.query();
  });

angular.module('neighborhoodApp')
  .controller('AreaShowCtrl', function ($routeParams, Area) {
    this.area = Area.get({
      id: $routeParams.aid
    });
  });

angular.module('neighborhoodApp')
  .controller('BuildingListCtrl', function (Building) {
    this.buildings = Building.query();
  });

angular.module('neighborhoodApp')
  .controller('BuildingShowCtrl', function ($routeParams, Building) {
    this.building = Building.get({
      aid: $routeParams.aid,
      id: $routeParams.rid
    });
  });

angular.module('neighborhoodApp')
  .controller('FlatShowCtrl', function (Flat) {
    this.flats = Flat.query();
  });

// What is the idiomatic way to pass the area id (from $routeParams.aid)
// so that the server can be queried successfully
angular.module('neighborhoodApp')
  .controller('FlatListCtrl', function ($routeParams, Flat) {
    this.flat = Flat.get({
      bid: $routeParams.bid,
      id: $routeParams.rid
    });
  });

app.config(function ($routeProvider) {
  $routeProvider
    .when('/areas', {
      templateUrl: 'views/area/list.html',
      controller: 'AreaListCtrl',
      controllerAs: 'list'
    })
    .when('/areas/:aid', {
      templateUrl: 'views/area/show.html',
      controller: 'AreaShowCtrl',
      controllerAs: 'show'
    })
    .when('/areas/:aid/buildings', {
      templateUrl: 'views/building/list.html',
      controller: 'BuildingListCtrl',
      controllerAs: 'list'
    })
    .when('/areas/:aid/buildings/:bid', {
      templateUrl: 'views/building/show.html',
      controller: 'BuildingShowCtrl',
      controllerAs: 'show'
    })
    .when('/areas/:aid/buildings/:bid/flats', {
      templateUrl: 'views/flat/list.html',
      controller: 'FlatShowCtrl',
      controllerAs: 'list'
    })
    .when('/areas/:aid/buildings/:bid/flats/:fid', {
      templateUrl: 'views/flat/show.html',
      controller: 'FlatListCtrl',
      controllerAs: 'show'
    })
    .otherwise({
      redirectTo: '/areas'
    });
});

1 个答案:

答案 0 :(得分:1)

我认为你根本不需要areaId,在检索公寓时,你只需要flatId。

但是,在保存新单位时,您可以将buildingId添加为单位的详细信息(在模型中)

.factory('Flat', function ($resource) {
    return $resource('/flats/:id', {

但是当你查询单位时,例如1区的所有单位

Flat.query({aid=1})

将转换为

www.yourapp.com/flat?aid=1

您不必将其添加到模型中,因为它不是模型的一部分。