AngularJS $资源将id作为查询参数传递给url

ors*_*zky 30 javascript angularjs angular-resource

我需要从其他API获取数据,其中产品ID是url的一部分(而不是查询参数).

工厂:

.factory('Products', ['$resource',
    function($resource) {
        return $resource('products/:productId', {
            productId: '@id'
        }, {
            query: {
                isArray: false
            },
            update: {
                method: 'PUT'
            }
        });
    }
])
Run Code Online (Sandbox Code Playgroud)

控制器:

$scope.getProduct = function(id, from) {
    $scope.product = Products.get({ id: id }, function(){
        console.log($scope.product);
    });
}
Run Code Online (Sandbox Code Playgroud)

我的网址构造如下:

/products?id=5426ced88b49d2e402402205
Run Code Online (Sandbox Code Playgroud)

代替:

/products/5426ced88b49d2e402402205
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Sun*_* D. 57

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

Products.get({ productId: id })
Run Code Online (Sandbox Code Playgroud)

以下是文档中的$resource一个片段,解释了它的工作原理:

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

在您的情况下,它没有在URL中找到"id"作为参数,因此它将其添加到查询字符串中.

  • 那么`@`前缀值的目的是什么呢?"如果参数值以@为前缀,那么该参数的值将从`data`对象的相应属性中提取(在调用action方法时提供).例如,如果`defaultParam`对象是`{someParam :'@ someProp'}`那么`someParam`的值将是`data.someProp`." 听起来你应该能够传入一个`id`值,资源会用它来填充`productId`参数.但这种情况并非如此. (7认同)
  • @Erik J这有点晚了,但我认为@prefixed值仅在你使用`$ resource`的实例时才有用,而不是使用资源类本身.资源的类方法(例如:`Products.get(productId:xx)`)没有从中提取ID的对象.但是如果你有一个产品资源的实例,它会从对象中提取@值并将其插入到URL中(例如:myProductResource.save()将发布到/ products /:productId) (2认同)