我正在研究我的第一个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'
});
});
答案 0 :(得分:1)
我认为你根本不需要areaId,在检索公寓时,你只需要flatId。
但是,在保存新单位时,您可以将buildingId添加为单位的详细信息(在模型中)
.factory('Flat', function ($resource) {
return $resource('/flats/:id', {
但是当你查询单位时,例如1区的所有单位
Flat.query({aid=1})
将转换为
www.yourapp.com/flat?aid=1
您不必将其添加到模型中,因为它不是模型的一部分。