【问题标题】:Sharepoint: How to check with an array of item IDs whether every item exists in a list?Sharepoint:如何使用一组项目 ID 检查每个项目是否存在于列表中?
【发布时间】:2019-12-18 20:03:22
【问题描述】:

我有一个动态生成的数组,其中包含不同项目和不同列表的 ID。

我想要什么:

返回我的数组中每个项目的自定义字段。

问题:

在删除项目之前没有问题。然后我会得到以下错误:

项目不存在。它可能已被其他用户删除。

我的想法:

也许有一个简单的选项来检查项目是否存在。带有项目 ID 的数组可能会变大,有超过 200 个不同列表的项目。所以我认为为每一个项目都创建一个 Ajax-Request 并不是一个好主意。没有更好的解决方案吗?

我的代码:

        var context = SP.ClientContext.get_current();                        
        for(var i in items){
            var web = context.get_web(items[i]['webId']);
            var list = web.get_lists().getById(items[i]['listId']);
            var item = list.getItemById(items[i]['itemId']);

            for(var j in columns){
                if(columns[j].getToLoad('web').length > 0){
                    for(var k in columns[j].getToLoad('web')){
                        context.load(web, columns[j].getToLoad('web')[k]);
                    }
                }
                if(columns[j].getToLoad('list').length > 0){
                    for(var k in columns[j].getToLoad('list')){
                        context.load(list, columns[j].getToLoad('list')[k]);
                    }
                }
                if(columns[j].getToLoad('item').length > 0){
                    for(var k in columns[j].getToLoad('item')){
                        context.load(item, columns[j].getToLoad('item')[k]);
                    }
                }
            }                
        }


        context.executeQueryAsync(
            buildTable.bind(this, items),
            function(a, b){
                console.error('ERROR: ' + b.get_message());
            }
        );

【问题讨论】:

  • 对我来说最好的解决方案是简单地忽略不存在的项目。
  • 你是如何使用这个脚本的?我知道您正在根据列表构建一些东西......但是在此之后您将如何处理这些信息?我的主要困惑是您的代码如何知道再次运行或在此代码第一次运行后删除了某个项目?
  • 简而言之,我在 Sharepoint 中构建了自己的表,其中包含不同列表的项目。我有一个数组,其中包含 web-ID、list-ID 和 item-ID。我从本地存储加载这个数组。首先,我加载网络和连接到网络的所需字段。其次,我加载列表和连接到列表的所需字段。最后我加载项目和连接到项目的所需字段。最后我执行 executeQueryAsync 来执行查询。它真的像一个魅力 - 直到从共享点删除一个项目,但不是从我的本地存储中的数组中删除。
  • buildTable 函数中没有出现该错误。它出现在以下行:console.error('ERROR: ' + b.get_message());

标签: javascript sharepoint sharepoint-2016 sharepoint-jsom


【解决方案1】:

我们可以不使用JSOM,而是使用batch requests with the REST API来实现您的要求。如果任何子操作失败,其他子操作仍然完成并且不会回滚。

示例代码how to execute SharePoint REST Batch request

var jsonSPHeaders = {  
    "Accept": "application/json;odata=verbose", 
    "Content-Type": "application/json;odata=verbose",
    "DataServiceVersion": "3.0" 
};

OData.request( {
    requestUri: _spPageContextInfo.webAbsoluteUrl + "/_api/$batch",
    method: "POST",
    headers: { "X-RequestDigest": $("#__REQUESTDIGEST").val(),
               "DataServiceVersion": "3.0" },
    data: { __batchRequests: [
       { requestUri: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('Pages')/items", method: "GET" , headers: jsonSPHeaders },
       { requestUri: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('Tasks')/items", method: "GET", headers: jsonSPHeaders }
    ]}
},
function (data, response) {
    console.log('Pages list:');
    printListItems(data.__batchResponses[0].data);
    console.log('Tasks list:');
    printListItems(data.__batchResponses[1].data);
}, 
null, 
OData.batchHandler);



function printListItems(data){
   data.results.forEach(function(item){
       console.log(item.Title); 
   });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多