如何才能获得用户当前视图/过滤器中的项目?使用Sharepoint 2010客户端对象模型(即Javascript / ECMAScript)。
用户可以选择显示库或列表中可用项目子集的视图,然后他们可以将过滤器应用于一个或多个列。我希望得到所有过滤的最终结果。我想在所有页面中为用户显示所有项目。
我已经看到很多示例代码依赖于知道当前视图以构建查询 - 在这种情况下这并没有真正帮助。我已经知道如何获得所选项目,例如
SP.ListOperation.Selection.getSelectedItems(SP.ClientContext.get_current());
但是,这只会选择当前页面中的项目。
谢谢!
答案 0 :(得分:2)
Sibirman的首选答案只会返回视图的原始查询。当用户应用过滤器操作时,用户指定的过滤器实际上附加到URL(作为InplviewHash字符串的一部分)。
e.g。 #InplviewHashf16272c0-c177-42d7-9638-35fd75c90348 = WebPartID%3D%7BF16272C0 - C177--42D7--9638--35FD75C90348%7D-的 FilterField1 强>%3DProjectRef-的 FilterValue1 强> %3DProject%25201-的 FilterField2 强>%3DAddress-的 FilterValue2 强>%3DPilbara
INPLVIEW.js中的函数和/ _layouts中的其他SP JavaScript文件包含解码此函数和重新初始化视图的函数,但我无法解读所有这些函数。
DecodeHashAsQueryString和InitGridFromView是一个很好的起点。
我最后编写自己的代码来检查哈希字符串,然后删除键/值对。
var uri = window.location.href;
var hashIndex = uri.search("#");
var filter = false;
if (hashIndex == -1) {
// Wasn't found
alert('No filters applied!');
// ...go with default query.
} else {
// # found. Get hashstring
var hashStr = uri.substring(hashIndex);
newStr = DecodeHashAsQueryString(hashStr);
var trStr = newStr.substring(newStr.indexOf("FilterField"));
var retStr = trStr.replace(/%3D|&/g,",").replace(/%2520/g," ");
retStr = retStr.replace(/FilterField[0-9]+,|FilterValue[0-9]+,/g,"")
var filtArray = retStr.split(','); // "MyField1","MyValue1",...
并将它们应用于我自己的查询,但不包含限制,因此返回的所有项目都符合过滤条件。
如果您想要处理文本opr选择以外的字段,您需要更进一步并获取字段类型,以便您可以根据需要修改每个字段的查询值类型。
答案 1 :(得分:1)
您可以通过两个请求来完成:
function getItemsFromView(listTitle, viewTitle)
{
var context = new SP.ClientContext.get_current();
var list = context.get_web().get_lists().getByTitle(listTitle);
var view = list.get_views().getByTitle(viewTitle);
context.load(view);
context.executeQueryAsync(
function(sender, args) {getItemsFromList(listTitle, "<View><Query>" + view.get_viewQuery() + "</Query></View>")},
function(sender, args) {alert("error: " + args.get_message());}
);
}
function getItemsFromList(listTitle, queryText)
{
var context = new SP.ClientContext.get_current();
var list = context.get_web().get_lists().getByTitle(listTitle);
var query = new SP.CamlQuery();
query.set_viewXml(queryText);
var items = list.getItems(query);
context.load(items);
context.executeQueryAsync(
function()
{
var listEnumerator = items.getEnumerator();
var i = 0;
while (listEnumerator.moveNext())
{
i++;
}
alert("items retrieved: " + i);
},
function(sender, args) {alert("error in inner request: " + args.get_message());}
);
}