2012-10-30 253 views
33

我的服务必须使用一个查询字符串由于运行传统的ASP服务器上的限制:查询字符串

angular 
    .module('myServices', ['ng', 'ngResource']) 
    .factory('Item', ['$resource', 
    function ($resource) { 
     return $resource('/api/?p=item/:id'); 
    }]); 

,我想额外的查询字符串参数添加到它:

Item.query({test: 123}, on_success, on_error); 

但得到的URL

/api/?p=item?test=123 

显然是有缺陷的,但如何解决呢?

编辑:提起这个在https://github.com/angular/angular.js/issues/1511

+0

为什么您使用{test:123}而不是{id:123}? – conradfr

+0

这是为了测试资源中未指定的参数是如何工作的。任何未在签名中声明的内容都会在查询字符串中结束。 – akonsu

+0

好吧,我误解了你的初始请求,但现在我不明白为什么它是一个错误? – conradfr

回答

68

可以使用资源参数。如果您尚未在路径中指定占位符,则会自动将其转换为查询字符串参数。这样的:

angular 
    .module('myServices', ['ng', 'ngResource']) 
    .factory('Item', [ 
     '$resource', 
     function ($resource) { 
      return $resource('/api'); 
    }]); 

Item.query({p: 'item/1'}); 

这将导致以/api?p=item/1的请求。

P.S.

我想你已经知道了,但你不喜欢它。但我仍然认为这是你的案子的正确方法。考虑到你正在处理的后端的糟糕的API设计,你可以用另一个服务来包装AngularJS资源,这个服务可以为你做到这一点。

+3

好例子,我希望这已经在Angular教程中,所有参数硬编码在他们的$资源示例中 –

+0

我不明白这个问题实际上回答了OP的问题,OP已经知道动态地添加一个查询参数,并且使用了一个Factory,这个信息本身可能非常有用,但我不明白为什么它实际上提供了超出OP已经写过。我在提出的答案中错过了一些增加额外价值的东西吗? – arcseldon

+0

@arcseldon OP在URL中存在两个问号字符问题,这解决了问题,并指出未定义的参数作为路径中的占位符进入查询字符串 –

0
var deferred = $q.defer(); 
api.api_name.query({ 
    'param':param_value 
}, 
    function(response) { 
     deferred.resolve(response); 
    }, 
    function(response) { 
     deferred.reject(response); 
    } 
); 
// 
angular 
    .module('module_name') 
    .factory('api',function($resource){ 
     var api_var={}; 
     api_var.api_name = $resource('url?param_key=:param', { 
      param: '@param' 
     }, { 
      'query': { 
       method: 'get' 
      } 
     }); 
     return api_var; 
    });