所以我正在为 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/