简体   繁体   English

Angular上的嵌套资源路由

[英]nested resources routes on Angular

I have this nested resources routes on my backend server /api/v1/hotels/:hotel_id/rooms/:id 我在我的后端服务器/api/v1/hotels/:hotel_id/rooms/:id上有这个嵌套的资源路由/api/v1/hotels/:hotel_id/rooms/:id

However, I don't know how to leverage the Angular ui-router to achieve the RESTful APIs on front-end side. 但是,我不知道如何利用Angular ui-router在前端实现RESTful API。

On my current code. 在我目前的代码上。

When I want to show the list of rooms which are belonging to Hotel id 1 当我想显示属于Hotel id 1的房间列表时

http://mysite.com.tw/index.html#/admin/rooms/1 http://mysite.com.tw/index.html#/admin/rooms/1

However, I want to make my route more RESTful. 但是,我想让我的路线更加RESTful。

It should be looks like 它应该是看起来像

http://mysite.com.tw/index.html#/admin/hotel/1/rooms/ http://mysite.com.tw/index.html#/admin/hotel/1/rooms/

However, Current ui router config will not allow me to do so. 但是,当前的ui路由器配置将不允许我这样做。

How could I adjust my ui router config to meet my requirement. 我怎样才能调整我的ui路由器配置以满足我的要求。

Thank you. 谢谢。

Config 配置

        .state('admin.hotels', {
            url: '/hotels',
            template: '<div ui-view class="fade-in"></div>',
            controller: 'hotelBaseCtrl',
            resolve: load(['js/services/hotel_service.js',
            './js/controllers/hotel/base_controller.js'])
        })
        .state('admin.hotels.index', {
            url: '/index',
            templateUrl: './admin_tpl/hotel/index.html',
            resolve: load([
            './js/controllers/hotel/index_controller.js',

            ])
        })

        .state('admin.rooms', {
            url: '/rooms',
            template: '<div ui-view class="fade-in"></div>',
            controller: 'roomBaseCtrl',
            resolve: load(['js/services/room_service.js',
            './js/controllers/room/base_controller.js'])
        })
        .state('admin.rooms.index', {
            url: '/:hotel_id',
            templateUrl: './admin_tpl/room/index.html',
            resolve: load([

            './js/controllers/room/index_controller.js',
            ])
        })

Room Service 客房服务

    (function() {
        'use strict';
        angular.module('roomModule', [])
            .factory('roomService', ['$resource',
                function($resource, $http) {
                    var room = $resource('/api/v1/hotels/:hotel_id/rooms/:room_id', {
                        hotel_id : '@hotel_id',
                        room_id : '@room_id',
                    }, {});
                    return room ;
                }
            ]);
    }());

Update 更新

When I trigger #/admin/hotels/1/rooms/index 当我触发#/admin/hotels/1/rooms/index

It will show me the unknown route behaviour 它会告诉我未知的路线行为

However, I think the kind of URL is more RESTful way. 但是,我认为这种URL更加RESTful。

What I expect is that the #/admin/hotels/1/rooms/index request 我期待的是#/admin/hotels/1/rooms/index请求

Which will trigger the 'admin.hotels.rooms.index' state. 这将触发'admin.hotels.rooms.index'状态。

the 1 is the hotel_id 1是hotel_id

It seems the kind of RESTful API is hard to acheieve with AngularJS? 似乎使用AngularJS很难实现RESTful API的那种?

        .state('admin.hotels', {
            url: '/hotels',
            template: '<div ui-view class="fade-in"></div>',
            controller: 'hotelBaseCtrl',
            resolve: load(['js/services/hotel_service.js',
            './js/controllers/hotel/base_controller.js'])
        })
        .state('admin.hotels.index', {
            url: '/index',
            templateUrl: './admin_tpl/hotel/index.html',
            resolve: load([
            './js/controllers/hotel/index_controller.js',
            ])
        })

        .state('admin.hotels.rooms', {
            url: '/rooms',
            template: '<div ui-view class="fade-in"></div>',
            controller: 'roomBaseCtrl',
            resolve: load(['js/services/room_service.js',
            './js/controllers/room/base_controller.js'])
        })
        .state('admin.hotels.rooms.index', {
            url: '/:hotel_id',
            templateUrl: './admin_tpl/room/index.html',
            resolve: load([
            './js/controllers/room/index_controller.js',

            ])
        })

For multiple optional route parameters eg /posts/tagged/:tag/page/:page it looks like the only solution right now is to declare multiple routes ie /posts/tagged/:tag and /posts/tagged/:tag/page/:page . 对于多个可选路由参数,例如/posts/tagged/:tag/page/:page它看起来像现在唯一的解决方案是声明多个路由,/posts/tagged/:tag/posts/tagged/:tag/page/:page

http://benfoster.io/blog/ui-router-optional-parameters http://benfoster.io/blog/ui-router-optional-parameters

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM