我正在使用AngularJS构建SharePoint应用程序,并且我正在尝试定义一个服务,该服务检索用户是否为管理员。服务本身已按预期成功记录/工作,但我不确定如何在控制器中使用它。我的最终目标是,当页面加载与控制器绑定时,该服务会检查他们是否是管理员。从那时起,我可以做各种魔术(例如重定向等)。这是我的服务:
// Check if user is an admin
appServices.factory('appAdminCheck', ['$resource', 'appCurrentUserProfile', 'appAdmins', function ($resource, appCurrentUserProfile, appAdmins) {
var userAdmin = [];
appCurrentUserProfile.query(function (usercheck) {
var userID = usercheck.Id;
appAdmins.query(function (admins) {
var admins = admins.value; // Data is within an object of "value", so this pushes the server side array into the $scope array
// Foreach type, push values into types array
angular.forEach(admins, function (adminvalue, adminkey) {
if (adminvalue.Admin_x0020_NameId == userID) {
userAdmin = true;
console.log("I'm an Admin" + userAdmin);
}
});
});
});
return userAdmin;
}]);
更新:仔细检查后,我想返回值数组,但它一直声明数组长度为0.我确定这是因为我没有正确“返回” 。
这是我更新的服务:
appServices.factory('appAdminCheck', ['$resource', 'appCurrentUserProfile', 'appAdmins', function ($resource, appCurrentUserProfile, appAdmins) {
var userAdmin = [];
var checkUser = function() {
appCurrentUserProfile.query(function (usercheck) {
var userID = usercheck.Id;
appAdmins.query(function (admins) {
var admins = admins.value; // Data is within an object of "value", so this pushes the server side array into the $scope array
// Foreach type, push values into types array
angular.forEach(admins, function (adminvalue, adminkey) {
if (adminvalue.Admin_x0020_NameId == userID) {
userAdmin.push({
isAdmin: 'Yes',
role: adminvalue.Role,
});
}
});
});
});
return userAdmin;
}
return {
checkUser: checkUser
};
}]);
以下是控制器中的日志记录调用:
var test = appAdminCheck.checkUser();
console.log(test);
答案 0 :(得分:2)
看到似乎发生了一些异步操作,您将要返回一个承诺。您可以通过链接来自其他服务的then
承诺解析回调来实现此目的(假设它们是$resource
个实例或类似的)。例如......
appServices.factory('appAdminCheck', function (appCurrentUserProfile, appAdmins) {
return function() {
return appCurrentUserProfile.query().$promise.then(function(usercheck) {
return appAdmins.query().$promise.then(function(admins) {
// this needs to change if admins.value is not an array
for (var i = 0, l = admins.value.length; i < l; i++) {
if (admins.value[i].Admin_x0020_NameId === usercheck.Id) {
return true;
}
}
return false;
});
});
};
});
然后,您可以在控制器中使用此承诺解决方案,例如
appAdminCheck().then(function(isAdmin) {
// isAdmin is true or false
});