javascript - SharePoint - 显示模板 - 访问客户端上下文对象

标签 javascript sharepoint display-templates

所以我正在为 SharePoint 创建显示模板,但在获取上下文时遇到了问题,因为我需要它来访问不同的列表及其项目等。我在搜索时看到的一种方法是这个:

var context = Srch.ScriptApplicationManager.get_clientRuntimeContext();

问题是我不知道如何访问这个对象的内容。每次我收到上下文未定义或为空的错误,或者我打印出它的字面量函数。在其他程序(不显示模板)中,我只会使用:

var context = new ClientContext(); 

var context = new SP.ClientContext();

或一些变体,但在这种情况下,我找不到任何文档或使用第一个的示例。只是(大部分)博客说您可以使用它来获取上下文。

我的代码现在大部分都被注释掉了。我现在只是想弄清楚这种情况。提前致谢。

编辑:

这是整个(项目显示模板)文件:

<html lang="en" xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
<head>

    <title>Marketing Page Item Template</title>

    <!--[if gte mso 9]><xml>
    <mso:CustomDocumentProperties>
    <mso:TemplateHidden msdt:dt="string">0</mso:TemplateHidden>
    <mso:MasterPageDescription msdt:dt="string">This is the item display template for the Marketing Page tasks.  This will organize list/items under its practice.</mso:MasterPageDescription>
    <mso:ContentTypeId msdt:dt="string">0x0101002039C03B61C64EC4A04F5361F385106603</mso:ContentTypeId>
    <mso:TargetControlType msdt:dt="string">;#SearchResults;#;#Content Web Parts;#</mso:TargetControlType>
    <mso:HtmlDesignAssociated msdt:dt="string">1</mso:HtmlDesignAssociated>
    <mso:ManagedPropertyMapping msdt:dt="string">'Title'{Title}:'Title','Assigned To'{Assigned To}:'AssignedTo','Due Date'{Due Date}:'DueDateOWSDATE;DueDate','URL'{URL}:'URL'</mso:ManagedPropertyMapping msdt:dt="string">
    </mso:CustomDocumentProperties>
    </xml><![endif]-->

</head>
<body>
    <div>
        <!--#_


        var siteURL = _spPageContextInfo.siteAbsoluteUrl;
        var title = $getItemValue(ctx, "Title");
        var assignedTo = $getItemValue(ctx, "Assigned To");
        var dueDate = $getItemValue(ctx, "Due Date");
        var listUrl = $getItemValue(ctx, "URL");


        SP.SOD.executeFunc('SP.js', 'SP.ClientContext', function() {

            var context = Srch.ScriptApplicationManager.get_clientRuntimeContext();

            var reqCtx = SP.RequestContext.getCurrent(context);
            var web = reqCtx.get_web();

            var pagesListId = SP.PageContextInfo.get_pageListId();
            var list = web.get_lists().getById(pagesListId);
            var items = list.getItems(SP.CamlQuery.createAllItemsQuery());

            context.load(items);

            context.executeQueryAsync(
               function(){
                   items.get_data().forEach(function(item){
                       console.log(item.get_item('FileRef')); 
                   });
               },
            function(sender,args){
              console.log(args.get_message()); 
            });
        });


        _#-->

            <li>

                <div style="background-color: honeydew; margin: 5px; padding: 5px;">

                <!--#_
                    if (!title.isEmpty)
                    {
                _#-->

                    <h3 style="color: coral;">Title: _#= $htmlEncode(title) =#_</h3>
                    <!--<p>_#= $htmlEncode(ctx.CurrentItem.Title) =#_</p>-->

                    <p>URL: _#= $htmlEncode(listUrl) =#_</p>
                    <p>URL: _#= $htmlEncode(typeof reqCtx) =#_</p>


                <!--#_
                    }

                    if (!assignedTo.isEmpty)
                    {
                _#-->

                        <p style="color: goldenrod;">Assigned To: _#= $htmlEncode(assignedTo) =#_</p>
                        <!--<p>_#= $htmlEncode(ctx.CurrentItem.AssignedTo) =#_</p>-->

                <!--#_
                    }

                    else
                    {
                _#-->

                        <p>There is no assigned person!</p>

                <!--#_
                    }

                    if (!dueDate.isEmpty)
                    {
                _#-->

                        <p style="color: rosybrown;">Due Date: _#= $htmlEncode(dueDate) =#_</p>
                        <!--<p>_#= $htmlEncode(ctx.CurrentItem.DueDateOWSDATE) =#_</p>-->

                <!--#_
                    }

                    else
                    {
                _#-->

                            <p>There is no due date!</p>

                <!--#_
                    }
                _#-->

             </div>

            </li>
    </div>
</body>
</html>

最佳答案

Srch.ScriptApplicationManager.get_clientRuntimeContext 函数返回 SP.ClientRuntimeContext object它代表从远程对象访问数据和调用远程对象方法的运行时上下文

以下示例演示了如何在显示模板中检索列表项和打印页面 url:

var context = Srch.ScriptApplicationManager.get_clientRuntimeContext();

var reqCtx = SP.RequestContext.getCurrent(context);
var web = reqCtx.get_web();

var pagesListId = SP.PageContextInfo.get_pageListId(); //Pages List Id
var list = web.get_lists().getById(pagesListId);
var items = list.getItems(SP.CamlQuery.createAllItemsQuery());
context.load(items);
context.executeQueryAsync(
   function(){
       items.get_data().forEach(function(item){
           console.log(item.get_item('FileRef')); 
       });
   },
   function(sender,args){
      console.log(args.get_message()); 
   });

确保SP.ClientRuntimeContext object已加载,您可以使用 SP.SOD.executeFunc function ,例如:

SP.SOD.executeFunc('SP.js', 'SP.ClientContext', function() {

    var context = Srch.ScriptApplicationManager.get_clientRuntimeContext();

    //the remaining code goes here...


});   

选项 2. 使用 SP.ClientContext

以下示例演示了如何利用 SP.ClientContext class在显示模板中:

 SP.SOD.executeFunc('SP.js', 'SP.ClientContext', function() {

        var context = SP.ClientContext.get_current();
        var web = context.get_web();

        var pagesListId = SP.PageContextInfo.get_pageListId();
        var list = web.get_lists().getById(pagesListId);
        var items = list.getItems(SP.CamlQuery.createAllItemsQuery());
        context.load(items);

        context.executeQueryAsync(
           function(){
               items.get_data().forEach(function(item){
                   console.log(item.get_item('FileRef')); 
               });
           },
        function(sender,args){
          console.log(args.get_message()); 
        });
 });

关于javascript - SharePoint - 显示模板 - 访问客户端上下文对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35610998/

相关文章:

javascript - 如何从方括号 [] 中包含值的字符串中获取值?

c# - 如何从 SharePoint 列表(文档库)获取驱动器 ID 以上传文件?

SharePoint wsp 解决方案 : How to Deploy Globally

asp.net-mvc - 在编辑器模板中调用具有相同模型的另一个编辑器模板

razor - ASP.NET MVC 4 仅定义字符串的显示模板

javascript - 随机 1-5 5x5 阵列

javascript - OnClick后的返回值

javascript - ExtJS 6. 无法将节点添加到树面板

c# - 如何在 Windows XP 和 Windows 7 上枚举 SharePoint 文件夹中的文件夹和文件

JavaScript/jQuery 不适用于使用 Ajax 加载的编辑器/显示模板