Angular 解析 REST 工厂变量
Angular Parse REST factory variables
我正在使用 angular 工厂对 Parse.com 上的 classes 执行 CRUD。我总共有 4 个 classes,需要对所有 4 个执行创建、获取、放置、删除。尽管每个 URL 不同,但其他一切都保持不变。我可以将变量传递给工厂以更改 api URL 中的 class 名称吗?
这是一个工厂的例子。
.factory('Programme',['$http','PARSE_CREDENTIALS',function($http,PARSE_CREDENTIALS){
return {
getAll:function(){
return $http.get('https://api.parse.com/1/classes/Programme',{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION
}
});
},
get:function(id){
return $http.get('https://api.parse.com/1/classes/Programme/'+id,{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION
}
});
},
create:function(data){
return $http.post('https://api.parse.com/1/classes/Programme',data,{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
});
},
edit:function(id,data){
return $http.put('https://api.parse.com/1/classes/Programme/'+id,data,{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
});
},
delete:function(id){
return $http.delete('https://api.parse.com/1/classes/Programme/'+id,{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
});
}
}
}])
显然这个 x4 是一团糟。
所以我需要将 URL 从 /Programmes
更改为 /Users
/Prescription
我是这样从我的控制器调用它的:
Programme.edit($localStorage.programme.id, {exerciseData:exercises}).success(function(data){
});
其次,我如何根据 Javascript SDK 将错误处理程序标记到此控制器函数上?
你是这个意思吗?
.factory('Programme',['$http','PARSE_CREDENTIALS',function($http,PARSE_CREDENTIALS){
var baseUrl = 'https://api.parse.com/1/classes/';
return {
provider:function(type) {
return {
getAll:function(){
return $http.get(getUrl(type),getParams());
},
get:function(id){
return $http.get(getUrl(type)+id,getParams());
},
create:function(data){
return $http.post(getUrl(type),data,getParams());
},
edit:function(id,data){
return $http.put(getUrl(type)+id,data,getParams());
},
delete:function(id){
return $http.delete(getUrl(type)+id,getParams());
}
}
function getUrl(type) {
return baseUrl+type;
}
function getParams() {
return {
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
}
}
}
}
}])
然后你可以这样称呼它:
Programme.provider('Prescription/').edit($localStorage.programme.id, {exerciseData:exercises}).success(function(data){
}).error(function(response){ ... };
1) 使用拦截器清理您的 url 代码:将以下内容放入您的 app.js
$httpProvider.interceptors.push(function ($q) {
return {
request: function(config) {
if (config.url.split('/')[0] === 'api'){
config.url = 'http://yourserverurl:3000/' + config.url.replace('api/', '');
}
return config || $q.when(config);
}
};
});
2) 在您的 url 请求中,您现在可以通过简单地调用 api/class 来修改它们,并且您可以提供类名作为参数以重用相同的功能。
示例:
create:function(classname, data){
return $http.post('api/' + classname, data, {
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
});
},
3) 对于 promise 的错误处理,只需使用 .error( errFunc )
示例:
Programme.edit($localStorage.programme.id, { exerciseData:exercises }).success(function(data){
}).error(function(response){ ... };
p.s 对于 1 和 2,请确保将 $httpProvider 添加到 app.js
中的 .config
我认为这确实应该使用资源来完成,并为您的对象抽象出特定的服务,而不是将所有东西都集中到一个大工厂中,这是一种坏习惯和形式。
为你的每个对象创建一个单独的服务......你也应该使用它会导致更好的代码的承诺。请记住,您 read/copy 的许多教程都是为了解释技术而不是构建生产应用程序。
使用 ng-resource
为特定对象定义服务
/**
* this factory wraps the use of angular-resource for interacting with the Kinvey
* models we have created.
* The factory also introduces the use of promises to handle the asynchronous http
* requests.
*
* @see doc - https://docs.angularjs.org/api/ngResource/service/$resource
* @see doc - $q - promises in angular - https://docs.angularjs.org/api/ng/service/$q
*/
.factory('MemberService', ['$resource', 'KINVEY', function ($resource, KINVEY) {
/**
*/
function genericErrorHandler(_error) {
console.log(_error.data);
$scope.response = _error.data;
}
var reqHeaders = {
'Authorization': KINVEY.auth
};
var Member = $resource(KINVEY.baseUrl + "members/:_id", {},
{
// headers are passed in as javascript name/value pairs
'query': {
headers: reqHeaders,
isArray: true
},
'save': {
method: 'POST',
headers: reqHeaders
},
'get': {
headers: reqHeaders
},
'update': {
method: 'PUT',
params: {_id: "@_id"},
headers: reqHeaders
},
'remove': {
method: 'DELETE',
headers: reqHeaders
}
});
return Member;
}]);
实际使用服务
/**
*
* @param $scope
*/
$scope.doList = function () {
// specific helper classes for the HTTP VERBS
MemberService.query()
.$promise.then(function (_response) {
$scope.response = _response;
}).catch(genericErrorHandler);
};
查看完整示例https://github.com/aaronksaunders/angular-kinvey-dataservices-example
我正在使用 angular 工厂对 Parse.com 上的 classes 执行 CRUD。我总共有 4 个 classes,需要对所有 4 个执行创建、获取、放置、删除。尽管每个 URL 不同,但其他一切都保持不变。我可以将变量传递给工厂以更改 api URL 中的 class 名称吗?
这是一个工厂的例子。
.factory('Programme',['$http','PARSE_CREDENTIALS',function($http,PARSE_CREDENTIALS){
return {
getAll:function(){
return $http.get('https://api.parse.com/1/classes/Programme',{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION
}
});
},
get:function(id){
return $http.get('https://api.parse.com/1/classes/Programme/'+id,{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION
}
});
},
create:function(data){
return $http.post('https://api.parse.com/1/classes/Programme',data,{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
});
},
edit:function(id,data){
return $http.put('https://api.parse.com/1/classes/Programme/'+id,data,{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
});
},
delete:function(id){
return $http.delete('https://api.parse.com/1/classes/Programme/'+id,{
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
});
}
}
}])
显然这个 x4 是一团糟。
所以我需要将 URL 从 /Programmes
更改为 /Users
/Prescription
我是这样从我的控制器调用它的:
Programme.edit($localStorage.programme.id, {exerciseData:exercises}).success(function(data){
});
其次,我如何根据 Javascript SDK 将错误处理程序标记到此控制器函数上?
你是这个意思吗?
.factory('Programme',['$http','PARSE_CREDENTIALS',function($http,PARSE_CREDENTIALS){
var baseUrl = 'https://api.parse.com/1/classes/';
return {
provider:function(type) {
return {
getAll:function(){
return $http.get(getUrl(type),getParams());
},
get:function(id){
return $http.get(getUrl(type)+id,getParams());
},
create:function(data){
return $http.post(getUrl(type),data,getParams());
},
edit:function(id,data){
return $http.put(getUrl(type)+id,data,getParams());
},
delete:function(id){
return $http.delete(getUrl(type)+id,getParams());
}
}
function getUrl(type) {
return baseUrl+type;
}
function getParams() {
return {
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
}
}
}
}
}])
然后你可以这样称呼它:
Programme.provider('Prescription/').edit($localStorage.programme.id, {exerciseData:exercises}).success(function(data){
}).error(function(response){ ... };
1) 使用拦截器清理您的 url 代码:将以下内容放入您的 app.js
$httpProvider.interceptors.push(function ($q) {
return {
request: function(config) {
if (config.url.split('/')[0] === 'api'){
config.url = 'http://yourserverurl:3000/' + config.url.replace('api/', '');
}
return config || $q.when(config);
}
};
});
2) 在您的 url 请求中,您现在可以通过简单地调用 api/class 来修改它们,并且您可以提供类名作为参数以重用相同的功能。 示例:
create:function(classname, data){
return $http.post('api/' + classname, data, {
headers:{
'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID,
'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY,
'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION,
'Content-Type':'application/json'
}
});
},
3) 对于 promise 的错误处理,只需使用 .error( errFunc ) 示例:
Programme.edit($localStorage.programme.id, { exerciseData:exercises }).success(function(data){
}).error(function(response){ ... };
p.s 对于 1 和 2,请确保将 $httpProvider 添加到 app.js
中的 .config我认为这确实应该使用资源来完成,并为您的对象抽象出特定的服务,而不是将所有东西都集中到一个大工厂中,这是一种坏习惯和形式。
为你的每个对象创建一个单独的服务......你也应该使用它会导致更好的代码的承诺。请记住,您 read/copy 的许多教程都是为了解释技术而不是构建生产应用程序。
使用 ng-resource
/**
* this factory wraps the use of angular-resource for interacting with the Kinvey
* models we have created.
* The factory also introduces the use of promises to handle the asynchronous http
* requests.
*
* @see doc - https://docs.angularjs.org/api/ngResource/service/$resource
* @see doc - $q - promises in angular - https://docs.angularjs.org/api/ng/service/$q
*/
.factory('MemberService', ['$resource', 'KINVEY', function ($resource, KINVEY) {
/**
*/
function genericErrorHandler(_error) {
console.log(_error.data);
$scope.response = _error.data;
}
var reqHeaders = {
'Authorization': KINVEY.auth
};
var Member = $resource(KINVEY.baseUrl + "members/:_id", {},
{
// headers are passed in as javascript name/value pairs
'query': {
headers: reqHeaders,
isArray: true
},
'save': {
method: 'POST',
headers: reqHeaders
},
'get': {
headers: reqHeaders
},
'update': {
method: 'PUT',
params: {_id: "@_id"},
headers: reqHeaders
},
'remove': {
method: 'DELETE',
headers: reqHeaders
}
});
return Member;
}]);
实际使用服务
/**
*
* @param $scope
*/
$scope.doList = function () {
// specific helper classes for the HTTP VERBS
MemberService.query()
.$promise.then(function (_response) {
$scope.response = _response;
}).catch(genericErrorHandler);
};
查看完整示例https://github.com/aaronksaunders/angular-kinvey-dataservices-example