AngularJS SharePoint-回调地狱停止工作

AngularJS SharePoint-回调地狱停止工作,angularjs,sharepoint,q,Angularjs,Sharepoint,Q,我以前工作的sharepoint服务停止工作了——我不知道为什么,它只是停止了 在我的控制器中,我调用服务函数,该函数将返回一些数据,我可以将这些数据放入范围变量中: var getItemsFromSPService = function () { SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () { SPService.loadItems($scope.gridParams).then(functi

我以前工作的sharepoint服务停止工作了——我不知道为什么,它只是停止了

在我的控制器中,我调用服务函数,该函数将返回一些数据,我可以将这些数据放入范围变量中:

var getItemsFromSPService = function () {
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {
        SPService.loadItems($scope.gridParams).then(function (result) {
            //result.items is always undefined!?
            $scope.gridParams.data = result.items;
            $scope.gridParams.itemsCount = result.itemsCount;
        });
    });
};
这是我的服务,一直到昨天:/

angular.module('app').service('SPService', ['$q', function ($q) {

var service = this;

service.currentUser = {
    id: null,
    login: null,
    fullLogin: null,
    roles: []
}

service.gridParams = {};

service.loadItems = function (gridParams) {

    service.gridParams = gridParams;
    //don't load SP user twice...
    if (service.currentUser.id != null) {            
        return loadListData();
    }
    else {            
        return loadCurrentUser().then(function () {
            return loadListData();
        })
    }        
};


//get current SP user and save to service.currentUser
var loadCurrentUser = function () {

    var deferred = $q.defer();

    var clientContext = new SP.ClientContext.get_current();
    var web = clientContext.get_web();
    clientContext.load(web);

    var currentSPUser = web.get_currentUser();
    clientContext.load(currentSPUser);

    clientContext.executeQueryAsync(
    function () {
        service.currentUser.id = currentSPUser.get_id();
        service.currentUser.fullLogin = currentSPUser.get_loginName();
        service.currentUser.login = service.currentUser.fullLogin;
        if (service.currentUser.login.indexOf("\\") > -1)
            service.currentUser.login = service.currentUser.login.slice(service.currentUser.login.indexOf("\\") + 1, service.currentUser.login.length)

        deferred.resolve(service.currentUser);

    }, function () {
        alert('Fehler beim Laden des Users aus dem SharePoint')
    })

    return deferred.promise;
}

var loadListData = function () {
    var deferred = $q.defer();

    var result = {
        items: [],
        itemsCount: null
    }

    //RowCount 
    getQueryRowCount().then(function (rowCount) {

        result.itemsCount = rowCount;

        var clientContext = new SP.ClientContext.get_current();
        var web = clientContext.get_web();
        clientContext.load(web);
        var list = web.get_lists().getByTitle(service.gridParams.listName);
        clientContext.load(list);

        var query = new SP.CamlQuery();
        var queryString = (buildQueryString(false));
        query.set_viewXml(queryString);

        var listItems = list.getItems(query);
        clientContext.load(listItems);          

        clientContext.executeQueryAsync(
        function () {
            //success
            var resultItems = [];
            var listItemEnumerator = listItems.getEnumerator();
            while (listItemEnumerator.moveNext()) {

                var listItem = listItemEnumerator.get_current();
                var listItemId = listItem.get_id().toString();

                //get specific item including EffectiveBasePermissions, after that, copy and push to result array
                getListItem(listItemId).then(function (returnedItem) {
                    var newItem = {};
                    angular.forEach(service.gridParams.columns, function (col) {

                        if (col == "Author")
                            newItem[col] = returnedItem.get_item(col).get_lookupValue();
                        else
                            newItem[col] = returnedItem.get_item(col);                            
                    })
                    newItem['WriteAccess'] = returnedItem.get_effectiveBasePermissions().has(SP.PermissionKind.editListItems);
                    result.items.push(newItem);

                    //result.items is there!!!! it holds the SP data
                });
            }

            deferred.resolve(result.items); //result.items is emtpty in debugger!?

        }, function () {
            //fail
            alert('Fehler beim Laden der SharePoint Liste.');
        });
    });

    return deferred.promise;
}

var getQueryRowCount = function() {
    var deferred = $q.defer();

    var clientContext = new SP.ClientContext.get_current();
    var web = clientContext.get_web();
    clientContext.load(web);
    var list = web.get_lists().getByTitle(service.gridParams.listName);
    clientContext.load(list);

    var query = new SP.CamlQuery();
    var queryString = (buildQueryString(service.gridParams, true));
    query.set_viewXml(queryString);
    var listItems = list.getItems(query);
    clientContext.load(listItems);

    clientContext.executeQueryAsync(
        function () {
            //success
            deferred.resolve(listItems.get_count());
        },
        function (sender, args) {
            //fail
            alert('Fehler beim Laden der Element-Anzahl.');
        });
    return deferred.promise;
}

var getListItem = function (listItem_id) {
    var deferred = $q.defer();

    var clientContext = new SP.ClientContext.get_current();
    var list = clientContext.get_web().get_lists().getByTitle(service.gridParams.listName);
    var listItem = list.getItemById(listItem_id);
    clientContext.load(listItem);
    clientContext.load(listItem, 'EffectiveBasePermissions');
    clientContext.executeQueryAsync(
        function () {
            //success
            deferred.resolve(listItem);
        },
        function (sender, args) {
            //fail
            alert('Fehler beim Laden der Element-Berechtigungen.');
        });
    return deferred.promise;
}

//other crud functions. saving works e.g. - same $q logic


}]);
你看到什么不正确的地方了吗

顺便说一句,如果SP.SOD.execureFunc()在服务中,并且服务将返回项目,我更希望它。所以我可以在控制器中执行类似的操作:

SPService.loadItems($scope.gridParams)

多谢各位

我找到了一个解决方案,但它相当脏,我不明白为什么旧代码停止工作

我将$scope作为参数转移到我的主服务函数。然后改变

var loadListData = function () {
    var deferred = $q.defer();

    ...
                result.items.push(newItem);
            });
        }

        deferred.resolve(result.items); //result.items is emtpty in debugger!?

    }, function () {
        //fail
        alert('Fehler beim Laden der SharePoint Liste.');
    });
});

那看起来是错的。。在服务函数中操作$scope。我甚至在函数中遗漏了主要的$q延迟内容

我只想将值返回给函数调用方。我只是不知道为什么它停止工作了

我对一个干净、最佳实践的解决方案非常感兴趣!:)


谢谢

第二种可能的方法是将“deferred.resolve(…)”更改为“scope.apply(deferred.resolve(…)”。还必须将$scope或$rootScope作为参数传递给服务函数。但这似乎没有直接在服务函数中操作$scope变量那么糟糕

我不知道使用$rootScope是否更好,根据这个线程,它是:


谢谢

代码墙。您尝试调试您的服务的是什么?“顺便说一句”是什么意思?好的,对不起。在承诺返回之前,请查看loadListData末尾的部分。您可以在注释中看到我调试的内容。“before”deferred.resolve(result.items)result.items数组中填充了数据。但这些数据似乎没有被返回。调试器显示“未定义”。顺便说一句:“要使用sharepoint客户端对象模型,必须加载sp.js。”。首先是SP.SOD.executeFunc('SP.js','SP.ClientContext',callback)。但该函数不从回调函数返回数据。至少我还没找到办法。这就是我想做的。在调试时,我发现了一些奇怪的行为。在“loadListData”的开头,您可以看到“getQueryRowCount()。然后(…”。该函数返回正确的行数。但在这之后,它会直接跳转到“deferred.resolve(result.items);//result.items在调试器中是emtpty!?”这应该只发生在result.items被填充之后。之后,它继续使用函数,填充数组中的数据,但不解析它(这就是之前发生的事情,而且不应该发生的事情),所以结果是未定义的。知道吗?
var loadListData = function () {
    service.scope.gridParams.data = [];

    ...
                service.scope.gridParams.data.push(newItem);
                service.scope.gridParams.itemsCount = result.itemsCount;
            });
        }

    }, function () {
        //fail
        alert('Fehler beim Laden der SharePoint Liste.');
    });
});