我以前的工作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