Javascript AngularJS$resource在url中将id作为查询参数传递

Javascript AngularJS$resource在url中将id作为查询参数传递,javascript,angularjs,angular-resource,Javascript,Angularjs,Angular Resource,我需要从RESTAPI获取数据,并将产品id作为url的一部分(而不是作为查询参数) 工厂: .factory('Products', ['$resource', function($resource) { return $resource('products/:productId', { productId: '@id' }, { query: { isArray: fals

我需要从RESTAPI获取数据,并将产品id作为url的一部分(而不是作为查询参数)

工厂:

.factory('Products', ['$resource',
    function($resource) {
        return $resource('products/:productId', {
            productId: '@id'
        }, {
            query: {
                isArray: false
            },
            update: {
                method: 'PUT'
            }
        });
    }
])
控制员:

$scope.getProduct = function(id, from) {
    $scope.product = Products.get({ id: id }, function(){
        console.log($scope.product);
    });
}
我的url的结构如下:

/products?id=5426ced88b49d2e402402205
而不是:

/products/5426ced88b49d2e402402205

你知道为什么吗?

当你在控制器中调用
Products.get()
时,你没有使用正确的参数名(根据
$resource
的定义,你需要使用“productId”而不是“id”)。试着这样称呼它:

Products.get({ productId: id })
以下是中的一个片段,解释了它的工作原理:

参数对象中的每个键值首先绑定到url模板(如果存在),然后将任何多余的键值附加到url搜索查询的?之后


在您的例子中,它在URL中找不到“id”作为参数,因此它将其添加到查询字符串中。

非常感谢,就是这样!:)那么,
@
前缀值的用途是什么呢?“如果参数值以@作为前缀,则该参数的值将从
数据
对象上的相应属性中提取(在调用操作方法时提供)。例如,如果
defaultParam
对象是
{someParam:'@someProp'}”
那么
someParam
的值将是
数据。someProp
“听起来您应该能够传入
id
值,资源将使用它填充
productId
参数。但事实并非如此,谢谢!今天帮了我@Erik J这有点晚了,但我认为@prefixed值只有在使用
$resource
实例时才有用,而不是使用resource类本身。资源的类方法(例如:
Products.get(productId:xx)
)没有从中提取ID的对象。但是,如果您有一个产品资源的实例,它将从对象中提取@value并将其插入URL(例如:myProductResource.save()将发布到/products/:productId)