AngularJS SharePoint-回调地狱停止工作
我以前工作的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
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.');
});
});