2015-03-24 94 views
0

我正在使用AngularJS构建SharePoint应用程序,并且试图定义一个检索用户是否是管理员的服务。服务本身按预期成功记录/工作,但我不确定如何在控制器中使用它。我的最终目标是,当加载一个与控制器绑定的页面时,该服务会检查它们是否为管理员。从那时起,我可以做各种魔术(例如重定向等)。这里是我的服务:使用AngularJS服务来检查用户是否具有管理员权限

// 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); 

回答

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 
}); 
+0

我相信这是接近,它让指出userCheck是不确定的,但我学习很多关于服务。 – Kode 2015-03-25 01:37:35

+0

谢谢菲尔。任何想法如何让它返回一个值,比如我的更新后的角色的角色?无论哪种情况,我都学到了很多东西。 – Kode 2015-03-25 03:46:08

+1

@Kode只需在最内层的承诺分辨率 – Phil 2015-03-25 04:12:23