使用 $resource 在不影响负载的情况下设置路径参数

Set path parameter without affecting payload using $resource

首先,我想说的是,我为此进行了大量研究。即使在 docs 中,我也找不到简单直接的答案。 (如果你愿意,请叫我笨蛋,以防文档中提到它!我似乎无论如何都找不到它。)

问题是,我想向表单 URL 发出 PUT 请求

app.constant('URL_REL_VENDOR_PRODUCTS', '/api/vendor/:vendorId/products/:productId');

但我不想将 vendorId 参数放在请求负载中。我的服务层看起来像这样:

services.factory('VendorProductService', function($resource, UserAccountService, URL_BASE, URL_REL_VENDOR_PRODUCTS) {
    return $resource(URL_BASE + URL_REL_VENDOR_PRODUCTS, {
        vendorId: UserAccountService.getUser().vendorId,
        id: '@id'
    }, {
        update: { method: 'PUT' }
    });
});

我知道我可以写一些类似 vendorId: '@vendorId' 的东西而不是 vendorId: UserAccountService.getUser().vendorId 但这会污染我的有效负载不是吗?

我不想保留我已经在示例中使用的机制,因为当您切换帐户时该机制不起作用,即,如果 UserAccountService.getUser() 已更新。基本上我必须重新加载整个页面才能再次初始化服务。

简而言之,问题是,正如标题所暗示的那样,如何设置路径参数 vendorId 而不使用类似代码段中的服务并且不修改负载?

将参数值设为函数:

services.factory('VendorProductService', function($resource, UserAccountService, URL_BASE, URL_REL_VENDOR_PRODUCTS) {
    return $resource(URL_BASE + URL_REL_VENDOR_PRODUCTS, {
        vendorId: function () {
            return UserAccountService.getUser().vendorId
        },
        id: '@id'
    }, {
        update: { method: 'PUT' }
    });
});

来自文档:

paramDefaults (optional)

Default values for url parameters. These can be overridden in actions methods. If a parameter value is a function, it will be executed every time when a param value needs to be obtained for a request (unless the param was overridden).

-- AngularJS $resource API Reference