SharePoint 2013 ClientContext:如何通过多个条件筛选器删除特定列表项?
SharePoint 2013 ClientContext : How to DELETE specific list items by MULTIPLE CONDITION filter?
通过使用 Javascript 结尾的 SP.ClientContext
,下面是我用于 "UPDATE" 列表项的代码。只需:
var clientContext = new SP.ClientContext( siteURL );
spList = clientContext.get_web().get_lists().getByTitle( myListName );
this.spList_ExistingItem = spList.getItemById( itemID );
spList_ExistingItem.set_item( 'FullName', myFullName );
spList_ExistingItem.set_item( 'Age', myAge );
spList_ExistingItem.update();
clientContext.executeQueryAsync(succeeded_handler, fail_handler);
这允许我update
一个列表项通过一个条件查询它:getItemById(itemID)
这里。
现在假设我要删除任何项目,即:
- 年龄 = 30
- 国家=美国
那么我如何使用多个条件进行这样的查询。然后还要删除好吗?
已更新
根据下面的回答,我发现与 CSOM 相比,REST API 对于 Client/Javascript 端使用起来更容易、更清晰。 (那么,当然我已经将所有代码更改为 REST API 方式。)
所以结论是,我建议使用 REST API 而不是 CSOM (SP.ClientContext)。
谢谢! :)
这可以通过两种不同的方式完成,使用 CSOM/JSOM 或通过 SharePoint REST API。由于您在问题中使用的是 CSOM/JSOM 模型,因此我只会向您展示如何使用该方法完成的。
使用CSOM/JSOM
要在多个条件下过滤 SP.ListItem
,没有将参数作为多个过滤字段的单一方法。相反,您将不得不使用 CAML 查询来指定您想要的列表项,如下所示。
var clientContext = new SP.ClientContext( siteURL );
spList = clientContext.get_web().get_lists().getByTitle( myListName );
//Create a CAML-query with your filter conditions
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><Query><Where><And><Eq><FieldRef Name=\'Age\'/>' +
'<Value Type=\'Number\'>30</Value></Eq>
<Eq><FieldRef Name=\'Country\'/>' +
'<Value Type=\'Text\'>US</Value></Eq></And></Where></Query><RowLimit>10</RowLimit></View>');
//The query will return a collection of items matching your conditions
this.collListItem = spList.getItems(camlQuery);
clientContext.load(collListItem);
//Execute the query
clientContext.executeQueryAsync(function () {
var itemCount = collListItem.get_count();
//For each list item in the collection, mark it to be deleted
for (var i = itemCount - 1; i >= 0; i--) {
var oListItem = collListItem.itemAt(i);
oListItem.deleteObject();
};
//Execute the delete operation
clientContext.executeQueryAsync(deleteSucceeded, deleteFailed);
}, fail_handler);
使用 SharePoint REST API
此方法假定您使用 jQuery 能够执行一些简单的 $.ajax()
调用并使用承诺功能,因为您可能有多个项目要删除。它还假定您了解如何使用 jquery 延迟对象将异步函数按顺序链接到 运行。
简单的想法就是
- 向 REST 发出请求 api 并获取所有符合您过滤条件的项目
- 对于返回的集合中的每个对象,发出另一个删除该项目的请求,并将该请求添加到请求数组中
- 当所有请求完成后,你想做什么就做什么!
请注意,您可能必须修改 REST api 调用以匹配您的列。只需使用浏览器或 Postman 检查您的请求是否正确。
function getItemsToDelete () {
//You might have to modify this so it filters correctly on your columns
var requestUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getByTitle(" + myListName + ")/items?$filter=Age eq 30 and Country eq 'US'")
//Return and ajax request (promise)
return $.ajax({
url: requestUrl,
type: "GET",
headers: {
"accept": "application/json;odata=verbose",
},
success: function(result) {
$.each(result.d.results, function(index, item){
//Note that we push the ajax-request to the array
//that has been declared a bit down
itemsToDelete.push(deleteItem(item));
});
},
error: function(error) {
//Something went wrong when retrieving the list items
}
});
}
function deleteItem (item) {
//All SP.ListItems holds metadata that can be accessed in the '__metadata' attribute
var requestUrl = item.__metadata.uri;
return $.ajax({
url: requestUrl,
type: "POST",
headers: {
"accept": "application/json;odata=verbose",
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
"IF-MATCH": item.__metadata.etag,
"X-HTTP-Method": "DELETE"
},
success: function() {
console.log("Item with ID " + item.__metadata.id + " successfully deleted!");
},
error: function(error) {
//Something went wrong when trying to delete the item
}
});
}
//Declare an array of deferred objects that hold a delete request
//for each item that is to be deleted
var itemsToDelete = [];
//First get the items to delete
$.when(getItemsToDelete()).then(function () {
$.when.apply($, itemsToDelete).then(function(){
console.log("All items are deleted!");
});
});
一些有用的资源
jQuery Deferred object
CRUD operations on list items with SharePoint REST api
通过使用 Javascript 结尾的 SP.ClientContext
,下面是我用于 "UPDATE" 列表项的代码。只需:
var clientContext = new SP.ClientContext( siteURL );
spList = clientContext.get_web().get_lists().getByTitle( myListName );
this.spList_ExistingItem = spList.getItemById( itemID );
spList_ExistingItem.set_item( 'FullName', myFullName );
spList_ExistingItem.set_item( 'Age', myAge );
spList_ExistingItem.update();
clientContext.executeQueryAsync(succeeded_handler, fail_handler);
这允许我update
一个列表项通过一个条件查询它:getItemById(itemID)
这里。
现在假设我要删除任何项目,即:
- 年龄 = 30
- 国家=美国
那么我如何使用多个条件进行这样的查询。然后还要删除好吗?
已更新
根据下面的回答,我发现与 CSOM 相比,REST API 对于 Client/Javascript 端使用起来更容易、更清晰。 (那么,当然我已经将所有代码更改为 REST API 方式。)
所以结论是,我建议使用 REST API 而不是 CSOM (SP.ClientContext)。
谢谢! :)
这可以通过两种不同的方式完成,使用 CSOM/JSOM 或通过 SharePoint REST API。由于您在问题中使用的是 CSOM/JSOM 模型,因此我只会向您展示如何使用该方法完成的。
使用CSOM/JSOM
要在多个条件下过滤 SP.ListItem
,没有将参数作为多个过滤字段的单一方法。相反,您将不得不使用 CAML 查询来指定您想要的列表项,如下所示。
var clientContext = new SP.ClientContext( siteURL );
spList = clientContext.get_web().get_lists().getByTitle( myListName );
//Create a CAML-query with your filter conditions
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><Query><Where><And><Eq><FieldRef Name=\'Age\'/>' +
'<Value Type=\'Number\'>30</Value></Eq>
<Eq><FieldRef Name=\'Country\'/>' +
'<Value Type=\'Text\'>US</Value></Eq></And></Where></Query><RowLimit>10</RowLimit></View>');
//The query will return a collection of items matching your conditions
this.collListItem = spList.getItems(camlQuery);
clientContext.load(collListItem);
//Execute the query
clientContext.executeQueryAsync(function () {
var itemCount = collListItem.get_count();
//For each list item in the collection, mark it to be deleted
for (var i = itemCount - 1; i >= 0; i--) {
var oListItem = collListItem.itemAt(i);
oListItem.deleteObject();
};
//Execute the delete operation
clientContext.executeQueryAsync(deleteSucceeded, deleteFailed);
}, fail_handler);
使用 SharePoint REST API
此方法假定您使用 jQuery 能够执行一些简单的 $.ajax()
调用并使用承诺功能,因为您可能有多个项目要删除。它还假定您了解如何使用 jquery 延迟对象将异步函数按顺序链接到 运行。
简单的想法就是
- 向 REST 发出请求 api 并获取所有符合您过滤条件的项目
- 对于返回的集合中的每个对象,发出另一个删除该项目的请求,并将该请求添加到请求数组中
- 当所有请求完成后,你想做什么就做什么!
请注意,您可能必须修改 REST api 调用以匹配您的列。只需使用浏览器或 Postman 检查您的请求是否正确。
function getItemsToDelete () {
//You might have to modify this so it filters correctly on your columns
var requestUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getByTitle(" + myListName + ")/items?$filter=Age eq 30 and Country eq 'US'")
//Return and ajax request (promise)
return $.ajax({
url: requestUrl,
type: "GET",
headers: {
"accept": "application/json;odata=verbose",
},
success: function(result) {
$.each(result.d.results, function(index, item){
//Note that we push the ajax-request to the array
//that has been declared a bit down
itemsToDelete.push(deleteItem(item));
});
},
error: function(error) {
//Something went wrong when retrieving the list items
}
});
}
function deleteItem (item) {
//All SP.ListItems holds metadata that can be accessed in the '__metadata' attribute
var requestUrl = item.__metadata.uri;
return $.ajax({
url: requestUrl,
type: "POST",
headers: {
"accept": "application/json;odata=verbose",
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
"IF-MATCH": item.__metadata.etag,
"X-HTTP-Method": "DELETE"
},
success: function() {
console.log("Item with ID " + item.__metadata.id + " successfully deleted!");
},
error: function(error) {
//Something went wrong when trying to delete the item
}
});
}
//Declare an array of deferred objects that hold a delete request
//for each item that is to be deleted
var itemsToDelete = [];
//First get the items to delete
$.when(getItemsToDelete()).then(function () {
$.when.apply($, itemsToDelete).then(function(){
console.log("All items are deleted!");
});
});
一些有用的资源
jQuery Deferred object CRUD operations on list items with SharePoint REST api