【问题标题】:Get items from current view/filter in Sharepoint 2010 - using client object model从 Sharepoint 2010 中的当前视图/过滤器获取项目 - 使用客户端对象模型
【发布时间】:2012-10-08 00:31:14
【问题描述】:

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

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

我已经看到很多示例代码,它们依赖于了解当前视图来构建查询——在这种情况下并没有真正的帮助。我已经知道如何获取选定的项目,例如

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

但是,这只会选择当前页面中的项目。

谢谢!

【问题讨论】:

  • 实际上,任何方法都可以——我提到了客户端对象模型,因为我目前正在使用它来获取选定的项目。不过好像看不到风景。

标签: sharepoint view sharepoint-clientobject


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以通过两个请求来做到这一点:

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

    【讨论】:

    • 您好,很抱歉缺席了,感谢您的回答-我认为您的第一个功能将不起作用,因为它需要视图,而我没有。您的第二个功能需要查询文本 - 我也不知道它是否可用。你会如何调用第二个函数?谢谢。
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多