AngularJS:变量" Global"到服务

时间:2014-05-17 02:26:20

标签: angularjs

我仍然在研究我的第一个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知之甚少,并承诺知道我可以改变什么,不知道什么,但我正在学习。我不想以错误的方式学习它。

非常感谢任何指导!

1 个答案:

答案 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 });