javascript SharePoint 客户端对象模型 - 如何读取多个网站中的同名列表
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17691748/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
SharePoint Client Object Model - How to read a list with the same name in multiple sites
提问by user2589862
My problem is the following:
我的问题如下:
I have a list under the site collection root representing projects called 'Project Register'. Each item in that list represents a project where I am storing the project name, status, URL and some other properties. The URL is stored because each item will have a corresponding SharePoint sub site under the same site collection that is created dynamically via a custom event receiver created in Visual Studio.
我在代表名为“项目注册”的项目的网站集根目录下有一个列表。该列表中的每一项都代表一个项目,我在其中存储了项目名称、状态、URL 和其他一些属性。之所以存储 URL,是因为每个项目在同一网站集下都有一个相应的 SharePoint 子网站,该网站集是通过在 Visual Studio 中创建的自定义事件接收器动态创建的。
Each project sub site has a list called 'Members' used to keep track of the people that is assigned to that project. This is a business requirement and this list is used for some other purposes outside the scope of this question.
每个项目子站点都有一个名为“成员”的列表,用于跟踪分配给该项目的人员。这是一项业务要求,此列表用于此问题范围之外的其他一些目的。
Now, my challenge is that I need to show in a dropdownlist of another list called 'Timesheet' the projects in which the logged user has been assigned to. This is to give the user the capabilities to enter the time spent in those projects. This timesheet list is nothing but an out-of-the-box SharePoint calendar list with some custom fields.
现在,我的挑战是我需要在另一个名为“时间表”的列表的下拉列表中显示已将登录用户分配到的项目。这是为了让用户能够输入在这些项目中花费的时间。此时间表列表只不过是带有一些自定义字段的现成 SharePoint 日历列表。
Below is the code I'm using but it keeps giving me the following error when retrieving the members list.
下面是我正在使用的代码,但在检索成员列表时它不断给我以下错误。
Uncaught TypeError: Cannot call method 'apply' of undefined
未捕获的类型错误:无法调用未定义的方法“应用”
Could anyone point me out in the right direction?
有人能指出我正确的方向吗?
The code I am using is in a custom .js file that I have properly referenced in my master page:
我使用的代码位于我在母版页中正确引用的自定义 .js 文件中:
$(document).ready(function () {
SP.SOD.executeOrDelayUntilScriptLoaded(loadMyProjects,'SP.js');
});
var $ddlMyProjectsNewItem;
var allProjects = new Array();
function loadMyProjects()
{
$ddlMyProjectsNewItem = $("#ctl00_ctl32_g_03acc13b_954d_4bdc_9544_b379206bc9d5_ctl00_ctl05_ctl00_ctl00_ctl00_ctl04_ctl00_Lookup");
var isTimesheetNewForm = $ddlMyProjectsNewItem.attr("id") != undefined ? true : false;
if(!isTimesheetNewForm)
{
return;
}
$ddlMyProjectsNewItem.empty();
// Get the current client context.
var clientContext = SP.ClientContext.get_current();
var web = clientContext.get_web();
var list = web.get_lists().getByTitle('Project Register');
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml("<View>" +
"<ViewFields>" +
"<FieldRef Name='Full_x0020_Project_x0020_Name' />" +
"<FieldRef Name='ID' />" +
"<FieldRef Name='Links' />" +
"</ViewFields>" +
"<Query>" +
"<Where>" +
"<Eq>" +
"<FieldRef Name='Status' />" +
"<Value Type='Lookup'>WIP</Value>" +
"</Eq>" +
"</Where>"+
"<OrderBy>" +
"<FieldRef Name='Full_x0020_Project_x0020_Name' Ascending='FALSE' />" +
"</OrderBy>" +
"</Query>" +
"</View>");
this.collListItem = list.getItems(camlQuery);
clientContext.load(collListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onProjectsQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onProjectsQuerySucceeded(sender, args) {
var listItemEnumerator = collListItem.getEnumerator();
while (listItemEnumerator.moveNext()) {
var oListItem = listItemEnumerator.get_current();
var projectId = oListItem.get_id();
var projectName = oListItem.get_item('Full_x0020_Project_x0020_Name');
var projectUrl = oListItem.get_item('Links');
allProjects.push(projectId + "|" + projectName + "|" + projectUrl);
}
$.each( allProjects, function( key, value ) {
var projectMembers = new ProjectSiteMembers(value);
projectMembers.get_members();
});
}
function ProjectSiteMembers(projectData) {
// console.log(projectData);
var projectValues = projectData.split('|');
this.projectId = projectValues[0];
this.projectName = projectValues[1];
this.projectUrl = projectValues[2];
this.clientContext = null;
this.website = null;
this.membersList = null;
this.collListItemMembers = null;
}
// Define the class methods.
ProjectSiteMembers.prototype = {
get_members: function () {
//console.log(this.projectUrl);
this.clientContext = new SP.ClientContext(this.projectUrl);
this.website = this.clientContext.get_web();
this.membersList = this.clientContext.get_web().get_lists().getByTitle('Members')
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml("<View>" +
"<ViewFields>" +
"<FieldRef Name='Member' />" +
"</ViewFields>" +
"<Query>" +
"<Where>" +
"<Eq>" +
"<FieldRef Name='Member' />" +
"<Value Type='Integer'>" +
"<UserID Type='Integer' />" +
" </Value>" +
"</Eq>" +
"</Where>"+
"</Query>" +
"</View>");
this.collListItemMembers = this.membersList.getItems(camlQuery);
this.clientContext.load(this.collListItemMembers);
// Everything works until this point
// This is the line giving me the error
this.clientContext.executeQueryAsync(Function.createDelegate(this, this.onProjectMembersQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
};
function onProjectMembersQuerySucceeded(sender, args) {
//console.log(this.projectId + " - " + this.projectName);
var listItemInfoMember = '';
var listItemMemberEnumerator = collListItemMembers.getEnumerator();
while (listItemMemberEnumerator.moveNext()) {
var oListItemMember = listItemMemberEnumerator.get_current();
$ddlMyProjectsNewItem
.append('<option value="' + this.projectId + '">' + this.projectName + '</option>');
}
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
回答by user2589862
After a review with a colleague we manage to fix the problem. It seems that I was doing an improper call to a method that was not defined in the scope of the javascript class. Those are the kind of silly mistakes that bug you out for several hours because you overlook them.
经过与同事的,我们设法解决了问题。似乎我对未在 javascript 类范围内定义的方法进行了不正确的调用。这些是愚蠢的错误,因为您忽略了它们,所以会困扰您几个小时。
Below is the actual working code after some refactoring so anyone can have it here for future references.
以下是经过一些重构后的实际工作代码,因此任何人都可以将其放在此处以供将来参考。
$(document).ready(function () {
SP.SOD.executeOrDelayUntilScriptLoaded(loadMyProjects,'SP.js');
});
var $ddlMyProjects;
var $ddlMyProjectsNewItem;
var $ddlMyProjectsEditItem;
var allProjects = new Array();
function loadMyProjects()
{
$ddlMyProjectsNewItem = $("#ctl00_ctl32_g_03acc13b_954d_4bdc_9544_b379206bc9d5_ctl00_ctl05_ctl00_ctl00_ctl00_ctl04_ctl00_Lookup");
$ddlMyProjectsEditItem= $("#ctl00_ctl32_g_23803b04_bdec_4c98_a4af_0b863da464c1_ctl00_ctl05_ctl00_ctl00_ctl00_ctl04_ctl00_Lookup");
var isTimesheetNewForm = $ddlMyProjectsNewItem.attr("id") != undefined ? true : false;
var isTimesheetEditForm = $ddlMyProjectsEditItem.attr("id") != undefined ? true : false;
if(isTimesheetNewForm)
{
$ddlMyProjects = $ddlMyProjectsNewItem;
}
else if(isTimesheetEditForm)
{
$ddlMyProjects = $ddlMyProjectsEditItem;
}
else
{
return;
}
$ddlMyProjects.empty();
// Get the current client context.
var clientContext = SP.ClientContext.get_current();
var web = clientContext.get_web();
var list = web.get_lists().getByTitle('Project Register');
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml("<View>" +
"<ViewFields>" +
"<FieldRef Name='Full_x0020_Project_x0020_Name' />" +
"<FieldRef Name='ID' />" +
"<FieldRef Name='Links' />" +
"</ViewFields>" +
"<Query>" +
"<Where>" +
"<Eq>" +
"<FieldRef Name='Status' />" +
"<Value Type='Lookup'>WIP</Value>" +
"</Eq>" +
"</Where>"+
"<OrderBy>" +
"<FieldRef Name='Full_x0020_Project_x0020_Name' Ascending='TRUE' />" +
"</OrderBy>" +
"</Query>" +
"</View>");
this.collListItem = list.getItems(camlQuery);
clientContext.load(collListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onProjectsQuerySucceeded), Function.createDelegate(this, this.onProjectsQueryFailed));
}
function onProjectsQuerySucceeded(sender, args) {
var listItemEnumerator = collListItem.getEnumerator();
while (listItemEnumerator.moveNext()) {
var oListItem = listItemEnumerator.get_current();
var projectId = oListItem.get_id();
var projectName = oListItem.get_item('Full_x0020_Project_x0020_Name');
var projectUrl = oListItem.get_item('Links');
allProjects.push(projectId + "|" + projectName + "|" + projectUrl);
}
$.each( allProjects, function( key, value ) {
var projectMembers = new ProjectSiteMembers(value);
projectMembers.get_members();
});
}
function onProjectsQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
function ProjectSiteMembers(projectData) {
// console.log(projectData);
var projectValues = projectData.split('|');
this.projectId = projectValues[0];
this.projectName = projectValues[1];
this.projectUrl = projectValues[2];
this.clientContext = null;
this.website = null;
this.membersList = null;
this.collListItemMembers = null;
}
// Define the class methods.
ProjectSiteMembers.prototype = {
onProjectMembersQuerySucceeded: function (sender, args) {
console.log(this.projectId + " - " + this.projectName);
var listItemInfoMember = '';
var listItemMemberEnumerator = this.collListItemMembers.getEnumerator();
while (listItemMemberEnumerator.moveNext()) {
var oListItemMember = listItemMemberEnumerator.get_current();
$ddlMyProjects.append('<option value="' + this.projectId + '">' + this.projectName + '</option>');
return false;
}
},
onProjectMembersQueryFailed: function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
},
get_members: function () {
console.log(this.projectUrl);
this.clientContext = new SP.ClientContext(this.projectUrl);
this.website = this.clientContext.get_web();
this.membersList = this.clientContext.get_web().get_lists().getByTitle('Members')
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml("<View>" +
"<ViewFields>" +
"<FieldRef Name='Member' />" +
"</ViewFields>" +
"<Query>" +
"<Where>" +
"<Eq>" +
"<FieldRef Name='Member' />" +
"<Value Type='Integer'>" +
"<UserID Type='Integer' />" +
" </Value>" +
"</Eq>" +
"</Where>"+
"</Query>" +
"</View>");
this.collListItemMembers = this.membersList.getItems(camlQuery);
this.clientContext.load(this.collListItemMembers );
this.clientContext.executeQueryAsync(Function.createDelegate(this, this.onProjectMembersQuerySucceeded), Function.createDelegate(this, this.onProjectMembersQueryFailed));
}
};