Sharepoint 异步查询中的委托函数

问题描述

我有一个 HTML 页面,它作为 Webpart 嵌入 Sharepoint(本地)中。

页面包含一个 Categories 列表,对于每个类别,一个 Requests 列表。

例如

 1. Category Name: "Cat 1" 
     - Request Name: "Req 1"
     - Request Name: "Req 2"
   
 2. Category Name: "Cat 2"
    - Request Name: "Req 3"

到目前为止,每个用户都能够看到所有类别和所有请求。现在,我想根据当前登录用户是否是名为 testGroup 的组的成员来隐藏一些类别/请求。

这是我的JS代码

SP.soD.executeFunc('sp.js','SP.ClientContext',function () { 
        var context = SP.ClientContext.get_current();
        var oGroup = context.get_web().get_siteGroups().getByName("testGroup");
        var oUsers = oGroup.get_users();
        var isMember = false;
        context.load(oUsers);
        context.executeQueryAsync(Function.createDelegate(this,onGroupSuccess),Function.createDelegate(this,onError));
        
        function onError(sender,args) { 
            alert("error: " + args.get_message()); 
        }
        
        function onRequestByCategorySuccess(sender,args) {         
            var html ="";
            for (var i = 0; i < requests.get_count() ; i++) {
                var request = requests.getItemAtIndex(i);
                var entry = {
                    id:request.get_id(),title: request.get_item('Title'),link: request.get_item('Link') == null ? "" : request.get_item('Link').get_url()
                };
                    
                if(isMember && entry.id === someOtherReqId) {
                    // append to HTML
                }                 
           }
        }
                        
        function onCategorySuccess(sender,args) {  
                    var html ="";
                    for (var i = 0; i < categories.get_count() ; i++) {
                        var category = categories.getItemAtIndex(i);
                        var entry = {
                            id:category.get_id(),title: category.get_item('Title'),image: category.get_item('Image') == null ? "" : category.get_item('Image').get_url()
                        };
                        
                        if(isMember && entry.id === someOtherCategoryId) {
                            // append to html
                        }
                                                    
                        var list = context.get_web().get_lists().getByTitle("RequestsList");
                        var query = new SP.CamlQuery();
                        query.set_viewXml("<View><Query><Where><Eq><FieldRef Name='Category' LookupId='TRUE'/><Value Type='Lookup'>" +entry.id + "</Value></Eq></Where></Query></View>");
                        var requests = list.getItems(query);
                        context.load(requests);
                        context.executeQueryAsync(Function.createDelegate(this,onRequestByCategorySuccess),onError));              
                    }
            }
            
        function onGroupSuccess(sender,args) {
            var oEnumerator = oUsers.getEnumerator();
            while (oEnumerator.moveNext()) {
                var oUser = oEnumerator.get_current();
                if(oUser.get_id() === _spPageContextInfo.userId) 
                    isMember = true;
            }
            
            var list = context.get_web().get_lists().getByTitle("CategoriesList");
            var query = new SP.CamlQuery();
            query.set_viewXml("<View><Query></Query></View>");
            var categories = list.getItems(query);
            context.load(categories);
            context.executeQueryAsync(Function.createDelegate(this,onCategorySuccess),onError));
        }
});

抛出异常,指出 get_count() 未定义。我认为这是因为 categories 变量为空。 我的问题是为什么?它与委托功能有关吗? 但是话又说回来,为什么在调用 oUsersonGroupSuccess 不为 null?

解决方法

因为 oUsers 变量在全局范围内,而 categories 不在。