如何:使用 JavaScript 检索列表项
上次修改时间: 2011年6月20日
适用范围: SharePoint Foundation 2010
本文内容
使用 JavaScript 检索列表项
使用 Include 方法
对检索列表项的限制
若要使用 ECMAScript(JavaScript、JScript)返回列表项,可使用 getItemById(id) 函数返回单个项,也可使用 getItems(query) 函数返回多个项。然后使用 load(clientObject) 函数获取代表这些项的列表项对象。
使用 JavaScript 检索列表项
可以使用 getItems(query) 函数定义协作应用程序标记语言 (CAML) 查询,以指定要返回哪些项。您可以传递一个未定义的 CamlQuery 对象以返回列表中的所有项,也可以使用 set_viewXml 函数定义一个 CAML 查询并返回符合特定条件的项。
以下示例显示 Announcements 列表中前 100 项的 ID 以及 Title 和 Body 列值,从集合 ID 大于 10 的列表项开始。
var siteUrl = '/sites/MySiteCollection';
function retrieveListItems() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('Announcements');
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><Query><Where><Geq><FieldRef Name=\'ID\'/>' +
'<Value Type=\'Number\'>1</Value></Geq></Where></Query><RowLimit>10</RowLimit></View>');
this.collListItem = oList.getItems(camlQuery);
clientContext.load(collListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onQuerySucceeded(sender, args) {
var listItemInfo = '';
var listItemEnumerator = collListItem.getEnumerator();
while (listItemEnumerator.moveNext()) {
var oListItem = listItemEnumerator.get_current();
listItemInfo += '\nID: ' + oListItem.get_id() +
'\nTitle: ' + oListItem.get_item('Title') +
'\nBody: ' + oListItem.get_item('Body');
}
alert(listItemInfo.toString());
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
上面的示例加载 CAML 查询指定的项目集合,随后访问返回的每个列表项对象上的所有默认属性。在 ECMAScript(JavaScript、JScript)中,指定 Include 语句作为传递给 load(clientObject) 函数的查询字符串的一部分。
使用 Include 方法
在返回列表项时,ListItem 对象的以下四个属性默认情况下不可用:displayName、effectiveBasePermissions、hasUniqueRoleAssignments 和 roleAssignments。如果您尝试访问其中一个属性,上面的示例将返回 PropertyOrFieldNotInitializedException。若要访问这些属性,请使用 Include 作为查询字符串的一部分。有关非默认属性的详细信息,请参阅数据检索概述。
若要修改上面的示例以返回 displayName 和 hasUniqueRoleAssignments 的值,可以将前面对 load(clientObject) 函数的调用替换为使用 LINQ 查询的调用。在 JavaScript 中,应指定 Include。
备注
当您使用 LINQ 针对客户端对象模型创建查询时,需使用 LINQ to Objects 而不是 LINQ to SharePoint 提供程序,只有在对服务器对象模型编写代码时,才能使用 LINQ to SharePoint 提供程序。
var siteUrl = '/sites/MySiteCollection';
function retrieveListItemsInclude() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('Announcements');
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><RowLimit>100</RowLimit></View>');
this.collListItem = oList.getItems(camlQuery);
clientContext.load(collListItem, 'Include(Id, DisplayName, HasUniqueRoleAssignments)');
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onQuerySucceeded(sender, args) {
var listItemInfo = '';
var listItemEnumerator = collListItem.getEnumerator();
while (listItemEnumerator.moveNext()) {
var oListItem = listItemEnumerator.get_current();
listItemInfo += '\nID: ' + oListItem.get_id() +
'\nDisplay name: ' + oListItem.get_displayName() +
'\nUnique role assignments: ' + oListItem.get_hasUniqueRoleAssignments();
}
alert(listItemInfo.toString());
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
因为该示例使用 Include,所以在执行查询后,只有指定的属性可用。因此,如果您尝试访问其他未指定的属性,将会收到 PropertyOrFieldNotInitializedException。此外,如果您尝试使用 get_contentType) 或 get_parentList) 等函数访问包含对象的属性,也会收到该错误。
对检索列表项的限制
Microsoft SharePoint Foundation 2010 中 JavaScript 对象模型的 loadQuery(clientObjectCollection, exp) 方法不支持托管对象模型使用的 LINQ 方法和操作。