问题是,我有多个API调用要按照以下思路进行:
www.domain.com/foo/bar?token=12345
中间可能有更多的子目录,可能有更少的子目录.
我目前正在使用$resource
agentApp.factory('apiFactory', function($resource) {
return $resource('www.domain.com/v1/' + ':folder',
{
'query': {
method: 'GET',
isArray: true
}
});它的调用如下:
apiFactory.query({folder: 'foo', token: '12345'}, function() {...})我想使它更可扩展,因为我需要偶尔将isArray值更改为false,并且有时URL中的子目录数量是未知的,所以我宁愿不使用$resource的:token结构,而只使用一个带有字符串的结构。
我是否可以创建一项服务,使我能够按以下方式进行呼叫:
apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });到目前为止,我已经尝试了以下方法,这显然没有给我想要的东西,我不知道如何让$resource真正启动API调用,我把这归结为对$resource工作方式的根本误解:
agentApp.factory('apiService', ['$resource', '$q', function ($resource, $q) {
var factory = {
query: function (urlStringAndQueries, isArray) {
return $q(
function() {
$resource('www.domain.com/v1/' + ':location', { location: urlStringAndQueries }, {
'query': {
method: 'GET',
isArray: isArray
}
});
}
)
},
return factory;
}]);我试图将其称为:
apiService.query('/foo/bar?token=12345', true)
.then(function(response) { ...do something with response });任何帮助和/或建议都是非常感谢的。谢谢!
编辑:这是我的解决方案,直到出现了一个更通用的模式
我不能简单地向外部的基本URL字符串提供一个额外的实体,例如foo/bar?token=12345,因为$response固有的编码URL,所以字符(/?=)被转换成它们的编码对应项。因此,模式中字符串的分离:
agentApp.factory('apiService', ['$resource', function($resource) {
var factory = {
resourceObj: function(isArray, urlStringAndQueries) {
/* urlStringAndQueries will be variadic parameters,
so we deconstruct them for use in the URL */
var location1, location2, location3, locations = [];
angular.forEach(arguments, function(path) {
locations.push(path);
});
return $resource(vapiURL + vapiVer + '/' + ':location1' + '/' + ':location2' + '/' + ':location3' + '/' + ':location4', {
location1: locations[1],
location2: locations[2],
location3: locations[3],
location4: locations[4],
}, {
'query': {
method: 'GET',
isArray: isArray
},
'save': {
method: 'POST',
isArray: isArray
}
})
}
};
return factory;
}]);这个解决方案仍然假定我将有有限的路径,这并不理想,但至少它很容易重用。
仍可接受更多更好的建议:)
发布于 2015-03-29 07:04:01
我不明白为什么您再次从服务方法中返回诺言对象,而$resource则返回承诺本身。别干那事
码
agentApp.factory('apiService', ['$resource', '$q', function($resource, $q) {
var factory = {
resourceObj: function(urlStringAndQueries, isArray) {
return $resource('www.domain.com/v1/' + ':location', {
location: urlStringAndQueries
}, {
'query': {
method: 'GET',
isArray: isArray
}
});
)
}
}]);调用工厂方法,然后访问资源对象,然后调用该资源对象方法的query
控制器
apiService.resourceObj('/foo/bar?token=12345', true).query()
.then(function(response) { ...do something with response });https://stackoverflow.com/questions/29324296
复制相似问题