我仍然在研究我的第一个AngularJS项目(通过模仿现有的应用程序来学习很多东西),并且想知道最佳实践和更好的技术。
我有一个将表单数据提取到SharePoint 365列表的服务。通过模仿示例,我可以从任何列表中获取数据。我担心的是代码的重复。每个函数声明SAME局部变量,我所做的就是更改函数名称和查询,但是有很多重复。最终,我将从超过30个列表中提取,并且必须保留重复的废话,直到我正确地学习它。
例如,这里有两个“较短”的功能。
appITI.service('SharePointJSOMService', function($q, $http){
// GET PRIORITIES
this.getPriorities = function(){
var deferred = $.Deferred();
JSRequest.EnsureSetup();
hostweburl = decodeURIComponent(JSRequest.QueryString["SPHostUrl"]);
appweburl = decodeURIComponent(JSRequest.QueryString["SPAppWebUrl"]);
var executor = new SP.RequestExecutor(appweburl);
executor.executeAsync({
url: appweburl + "/_api/SP.AppContextSite(@target)/web/lists/GetByTitle('itipriorities')/items?$select=id,Title&@target='" + hostweburl + "'",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: function(data, textStatus, xhr){
deferred.resolve(JSON.parse(data.body));
},
error: function(xhr, textStatus, errorThrown){
deferred.reject(JSON.stringify(xhr));
}
});
return deferred;
}; // /getPriorities
// GET PRIORITYGROUPS
this.getPriorityGroups = function(){
var deferred = $.Deferred();
JSRequest.EnsureSetup();
hostweburl = decodeURIComponent(JSRequest.QueryString["SPHostUrl"]);
appweburl = decodeURIComponent(JSRequest.QueryString["SPAppWebUrl"]);
var executor = new SP.RequestExecutor(appweburl);
executor.executeAsync({
url: appweburl + "/_api/SP.AppContextSite(@target)/web/lists/GetByTitle('itiPriorities')/items?$select=id,Priority_Group&@target='" + hostweburl + "'",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: function(data, textStatus, xhr){
deferred.resolve(JSON.parse(data.body));
},
error: function(xhr, textStatus, errorThrown){
deferred.reject(JSON.stringify(xhr));
}
});
return deferred;
}; // /getPriorities
}
我对AngularJS知之甚少,并承诺知道我可以改变什么,不知道什么,但我正在学习。我不想以错误的方式学习它。
非常感谢任何指导!
答案 0 :(得分:2)
我会使用单一方法来减少您的代码库。带有元数据的闭包可以简化创建服务的过程。这看起来像是:
appITI.factory('SharePointJSONService', function($q, $http,metadata){
var service = {};
angular.forEach(metadata,function(listDescriptor,listName){
//this === service
this["get"+listName] = function(){ return get(listDescriptor); };
},service);
function get(listDescriptor){
var deferred = $q.defer();
JSRequest.EnsureSetup();
hostweburl = decodeURIComponent(JSRequest.QueryString[listDescriptor.hostUrl]);
appweburl = decodeURIComponent(JSRequest.QueryString[listDescriptor.appUrl]);
var executor = new SP.RequestExecutor(appweburl);
executor.executeAsync({
url: appweburl + listDescriptor.path;
method: listDescriptor.method,
headers: listDescriptor.headers
success: function(data, textStatus, xhr){
deferred.resolve(JSON.parse(data.body));
},
error: function(xhr, textStatus, errorThrown){
deferred.reject(JSON.stringify(xhr));
}
});
return deferred.promise;
}
return service;
});
您只需要创建一个元数据对象,以满足该代码。类似的东西:
appITI.constant('metadata',{
Priorities: {
hostUrl: ...
appUrl: ...
method: "GET",
headers: ...
etc..
},
PriorityGroups:{
...
}
});
然后使用$q
的角度承诺,因此不需要$scope.$apply
在您的控制器中:
SharePointJSONService.getPriorities().then(
function success(res){
$scope.priorities = res.d.results;
},
function error(){ //error });