Jquery Ajax REST嵌套列表和人员选择器
使用Ajax/Rest/Jquery/Sharepoint列表。。。 列表:用户->部门->经理经理是部门中的人员选取项,被视为第三个列表。 这让我进入第二层。我可以使用行[Department].Title访问标题,例如,从查找字段Department或其中任何其他字段(该字段不是对其他列表的查找)访问标题。 这就是它变得毛茸茸的地方。。。 经理是部门列表中的人员选择器字段。 我需要的是能够抓住经理的名字,这是一个层次进一步。 将上述查询用作理论上而非现实中的基线,看起来如下所示:Jquery Ajax REST嵌套列表和人员选择器,jquery,ajax,rest,sharepoint-online,jscript,Jquery,Ajax,Rest,Sharepoint Online,Jscript,使用Ajax/Rest/Jquery/Sharepoint列表。。。 列表:用户->部门->经理经理是部门中的人员选取项,被视为第三个列表。 这让我进入第二层。我可以使用行[Department].Title访问标题,例如,从查找字段Department或其中任何其他字段(该字段不是对其他列表的查找)访问标题。 这就是它变得毛茸茸的地方。。。 经理是部门列表中的人员选择器字段。 我需要的是能够抓住经理的名字,这是一个层次进一步。 将上述查询用作理论上而非现实中的基线,看起来如下所示: &
&$select=Username/Name,Department/Name,Department/Manager/Name&$expand=Username,Department,Department/Manager
我尝试了不同的方法来提取这些数据。我要寻找的最终结果是有一行包含User、Title、Department、Manager等列
以下是我目前的情况:
url: siteURL + "/_api/web/lists/getbytitle('USERLISTNAME')/Items?$select=ID,Employee/Title,Employee/EMail,Title,Office_x0020_Phone,Remote_x0020_Phone,Department/Title&$expand=Department,Employee";
...
function Success__Handler(data) {
try {
var DataTable = $('#EMPLOYEE').DataTable();
if (DataTable != 'undefined') {
DataTable.destroy();
}
DataTable = $('#EMPLOYEE').DataTable({
"aaData": data.d.results,
order: [[0,'asc']],
"aoColumns": [{
"mData": "Employee.Title",
}, {
"mData": "Department.Title",
"render": function(data, type, row, meta){
}, {
"mData": "Employee.Title",
}, {
"mData": "Department.Title",
"render": function(data, type, row, meta){
if (row['Department']['results'].length == 0) {
return "";
} else {
for ( i=0, l=row['Department']['results'].length; i<l; i++) {
if ( i == 0 ) {
departments= row['Department']['results'][i].Title;
} else {
departments = departments + '<br/>' + row['Department']['results'][i].Title;
}
}
return brands;
}
}
...
部门/经理不工作,我收到一个无效字段错误。我相信我的问题在于最初的查询。我看过关于嵌套查询的不同帖子,但似乎没有一篇有效。我查看了RESTAPI文档,其中提到了嵌套列表,但我无法将它们的任何示例转换为这种情况
如果您对此有任何帮助,我将不胜感激。我解决这一问题的方法是将用户初始化嵌套在部门初始化的成功处理程序中。这不是最好的方法,我知道可能有一个更简单的解决方案,但它奏效了。SharePoint不支持嵌套OData扩展 举个例子
Employees (primary list, which contains Department lookup field
|
-> Departments (foreign list, which contains Manager user field)
<>你可以考虑下面的解决方案。
1分为两个请求:
/_api/web/lists/getbytitle'Employee'/items?$select=Title,部门id返回员工列表和部门id
/_api/web/lists/getbytitle'Department'/items?$select=Id、Title、Manager/Title&$expand=Manager检索部门列表以及经理详细信息
2在客户端整合结果。由于SharePoint Online支持,两个请求都可以通过单个请求执行,例如通过库执行,如下所示
范例
在哪里
我解决这个问题的方法是将用户初始化嵌套在部门初始化的成功处理程序中。不是最好的方法,我知道可能有一个更简单的解决方案,但它奏效了。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-它回答了我的问题,不过是一种迂回的方式。我必须先迭代部门列表,然后用经理的部门设置一个数组。然后在用户数据表的成功处理程序中重新迭代该数组,并将其与department字段进行比较。正如我所说的,我想要一个更好的解决方案,但这是迄今为止我找到的唯一方法。如果可能的话,我会选择它作为答案,直到有人想出更好的办法。显然你不能回答自己的问题
var jsonSPHeaders = {
"Accept": "application/json;odata=verbose",
"Content-Type": "application/json;odata=verbose",
"DataServiceVersion": "3.0"
};
OData.request( {
requestUri: _spPageContextInfo.webAbsoluteUrl + "/_api/$batch",
method: "POST",
headers: { "X-RequestDigest": document.getElementById("__REQUESTDIGEST").value,
"DataServiceVersion": "3.0" },
data: { __batchRequests: [
{ requestUri: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('Employee')/items?$select=Title,DepartmentId", method: "GET" , headers: jsonSPHeaders },
{ requestUri: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('Department')/items?$select=Id,Title,Manager/Title&$expand=Manager", method: "GET" , headers: jsonSPHeaders },
]}
},
function (data, response) {
var result = data.__batchResponses[0].data.results.map(function(item){
var projectedItem = resolveProjectedItem(data.__batchResponses[1].data.results,item.DepartmentId) || {};
projectedItem.Manager = projectedItem.Manager || {};
return {
"employee" : item.Title,
"department": projectedItem.Title,
"manager": projectedItem.Manager.Title
};
});
console.log(result);
},
null,
OData.batchHandler);
function resolveProjectedItem(items,id){
var result = items.filter(function(item){
if(item.Id === id)
return item;
});
if(result.length > 0)
return result[0];
return null
}