2012-10-08 37 views
4

如何获取用户当前视图/过滤器中的项目?使用Sharepoint 2010客户端对象模型(即Javascript/ECMAScript)。从Sharepoint 2010中的当前视图/过滤器获取项目 - 使用客户端对象模型

用户可以选择一个显示库或列表中可用项的子集的视图,然后他们可以将过滤器应用于一个或多个列。我想获得所有筛选的最终结果。我希望所有的项目在所有页面中都可见。

我见过很多示例代码,这些代码依赖于了解当前视图以构建查询 - 在这种情况下并不真正有帮助。我已经知道如何得到所选的项目,例如

SP.ListOperation.Selection.getSelectedItems(SP.ClientContext.get_current());

然而,只有选择在当前页面中的项目。

谢谢!

+0

实际上,任何方法都可以 - 我提到客户端对象模型,因为我目前正在使用它来获取所选项目。虽然似乎无法看到。 – Chalky

回答

2

通过Sibirman的首选答案只会返回原始查询的视图。当用户应用过滤器操作时,用户指定的过滤器实际上被追加到URL(作为InplviewHash字符串的一部分)。

例如#InplviewHashf16272c0-c177-42d7-9638-35fd75c90348 = WebPartID%3D%7BF16272C0 - C177--42D7--9638--35FD75C90348%7D-FilterField1%3DProjectRef- FilterValue1%3DProject%25201- FilterField2%3DAddress - FilterValue2%3DPilbara

有一些功能,可实现该解码和重新初始化在视图中INPLVIEW.js和其他SP的JavaScript文件功能/ _layouts,但我没能破译这一切。

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 choice以外的字段,您需要更进一步并获取字段类型,以便您可以根据需要修改每个字段的查询的值类型。

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());} 
    ); 

} 
+0

您好,抱歉已经缺席,谢谢您的回答 - 我认为您的第一个功能不起作用,因为它需要视图,我没有。你的第二个功能需要查询文本 - 我不知道这是否可用。你会怎么称呼第二个功能?谢谢。 – Chalky

相关问题