Angular资源重写URL未生效

7

这里的文档说明:

url – {string} – action specific url override. 
The url templating is supported just like for the resource-level urls.

我想使用这个好的功能,我尝试了这个:
angular.module("experience", ['ngResource'])

    .factory('Experience', function ($resource, identity) {

    return $resource("api/experiences/:id", {}, {
        queryAll : {
            method  : 'GET',
            url     : 'api/companies/' + identity.id + '/experiences',
            isArray : true
        }
    });
});

您看我正在尝试覆盖queryAll方法的URL。但是这并没有起作用,查询仍然发送到URL api/experiences。这个问题是否得到了支持或者我做错了什么?感谢任何帮助。


你使用的是哪个版本的 Angular?我在 Angular 1.1.4 中成功地使用了这个功能。在我的情况下,不同之处在于原始 URL 是有参数的,也就是说我有像 $resource("api/xxx",...) 这样的东西,而不是你的 $resource("api/xxx/:id",..) - Nikos Paraskevopoulos
感谢您的评论,我正在使用最新版本1.2。我猜api/xxx或api/xxx/:id不会影响任何东西? - bingjie2680
我猜它应该不会影响任何事情,但你永远不知道 :) 顺便说一下,还有另一个区别:我正在使用POST而不是GET。 - Nikos Paraskevopoulos
谢谢...我都试过了,但都不行。非常奇怪... - bingjie2680
这在1.2.4版本中对我也不起作用。你解决了吗? - ac360
不好意思,欢迎发表答案如果有人解决了这个问题。 - bingjie2680
2个回答

2
我在我的项目中遇到了非常相似的问题。资源操作中的url无法被覆盖。我使用的是Angular 1.2.0,因为从1.1.4版本开始支持该功能。所以我查看了Angular API参考和CHANGELOG,但没有找到解决方法。然后我深入研究了源代码并注意到覆盖url的逻辑不在那里。这就是问题的根本原因。我将Angular更新到了1.2.0,但我忘记将angular-resource.js更新到相应版本。
长话短说:检查angular-resource.js的版本

1

我不确定你是否可以在url覆盖中访问identity的属性,但你可以尝试类似这样的方法:

return $resource("api/experiences/:id", {}, {
    queryAll : {
        method  : 'GET',
        url     : 'api/companies/:id/experiences',
        params  : { id: identity.id },
        isArray : true
    }
});

id: identity.id告诉Angular使用identity的id属性(如果存在)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接