使用AngularJS服务检查用户是否具有管理员权限

使用AngularJS服务检查用户是否具有管理员权限,angularjs,Angularjs,我正在使用AngularJS构建一个SharePoint应用程序,并试图定义一个服务来检索用户是否是管理员。服务本身正在成功地按预期记录/工作,但我不确定如何在控制器中使用它。我的最终目标是,当加载绑定到控制器的页面时,该服务检查它们是否是管理员。从这一点上,我可以做各种各样的魔术(例如重定向,等等)。这是我的服务: // Check if user is an admin appServices.factory('appAdminCheck', ['$resource', 'appCu

我正在使用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);

由于出现了一些异步操作,您需要返回一个承诺。您可以通过链接
然后
来自其他服务的承诺解析回调(假设它们是
$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;
            });
        });
    };
});

我相信这很接近,它一直说userCheck是未定义的,但我学到了很多关于服务的知识。谢谢Phil。有没有关于如何让它返回一个值的想法,比如在我更新的帖子中的角色?无论是哪种情况,我都学到了很多。@Kode只需返回最内在的承诺解决方案中的其他内容即可,并为返回值打开了许多选项
appAdminCheck().then(function(isAdmin) {
    // isAdmin is true or false
});