我以前的工作Sharepoint服务停止工作 - 我不知道为什么,它只是停了下来。AngularJS 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
}]);
你看到任何不正确的东西吗?
btw。如果SP.SOD.execureFunc()将在服务中并且该服务将返回项目,我会更喜欢它。所以我可以在控制器中这样做:
SPService.loadItems($scope.gridParams)
非常感谢!
墙上的代码。你有什么试图调试你的服务? “btw”句子是什么? – Marco
好吧对不起。请在承诺返回之前查看loadListData末尾的部分。你可以在评论中看到我调试的内容。 “before”deferred.resolve(result.items)result.items数组填充了数据。但该数据似乎没有被返回。调试器显示“未定义”。 – uNki
“btw”句子:要使用sharepoint客户端对象模型,您必须加载sp.js.首先SP.SOD.executeFunc('sp.js','SP.ClientContext',回调)。但该函数不会从回调函数返回数据。至少我还没有找到办法。这就是我想要做的。 – uNki