使用Javascript客户端对象模型在Sharepoint中使用连接更新ProjectedField

使用Javascript客户端对象模型在Sharepoint中使用连接更新ProjectedField,sharepoint,sharepoint-clientobject,Sharepoint,Sharepoint Clientobject,假设我有两个列表:团队和员工。每个团队都有一定数量的员工: Teams ID Name Employees ID Name TeamID (foreign key of Teams) 如果我创建了员工离开加入团队的加入查询,那么我可以设置_项并更新团队中的Name字段吗 var ctx = SP.ClientContext.get_current(); var list = clientContext.get_web().get_lists().getByTitle('E

假设我有两个列表:团队和员工。每个团队都有一定数量的员工:

Teams
  ID
  Name

Employees
  ID
  Name
  TeamID (foreign key of Teams)
如果我创建了员工离开加入团队的加入查询,那么我可以设置_项并更新团队中的Name字段吗

var ctx = SP.ClientContext.get_current();
var list = clientContext.get_web().get_lists().getByTitle('Employees');

var queryText = 
"<View>" +
  "<Query></Query>" +
  "<ProjectedFields>" +
    "<Field Name='TeamName' Type='Lookup' List='Team' ShowField='Name' />" +
  "</ProjectedFields>" +
  "<Joins>" +
    "<Join Type='INNER' ListAlias='Team'>" +
      "<Eq>" +
        "<FieldRef Name='TeamID' RefType='Id'/>" +
        "<FieldRef List='Team' Name='ID'/>" +
      "</Eq>" +
    "</Join>" +
  "</Joins>" +
  "<ViewFields>" +
    "<FieldRef Name='TeamName'/>" + 
  "</ViewFields>" +
"</View>";   

var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(queryText);

var listItemsCollection = list.getItems(camlQuery);
ctx.executeQueryAsync(onSuccess, onError);
这是否得到支持?我目前没有办法尝试这个


如果没有,还有什么选择?

否,只能更新包含列表项的字段。但是您可以考虑以下方法来更新投影字段。 由于投影字段作为查找值返回,您可以检索投影列表项并更新其属性,如下所示:

var listTitle = 'Employees';
var joinListTitle = 'Teams' 
var joinFieldName = 'TeamID';
var projectedFields = ['Name'];


getListItems(listTitle,joinListTitle,joinFieldName,projectedFields,
  function(items){

     var item = items.get_data()[0]; //get first item
     var itemId = item.get_item('TeamsName').get_lookupId(); //get projected list item id
     var propertiesToUpdate = {'Name': 'New Team Name'};

     updateListItem(joinListTitle,itemId,propertiesToUpdate,function(item){
        console.log('List Item has been updated');
     },
     logError);


  },
 logError);
在哪里

var listTitle = 'Employees';
var joinListTitle = 'Teams' 
var joinFieldName = 'TeamID';
var projectedFields = ['Name'];


getListItems(listTitle,joinListTitle,joinFieldName,projectedFields,
  function(items){

     var item = items.get_data()[0]; //get first item
     var itemId = item.get_item('TeamsName').get_lookupId(); //get projected list item id
     var propertiesToUpdate = {'Name': 'New Team Name'};

     updateListItem(joinListTitle,itemId,propertiesToUpdate,function(item){
        console.log('List Item has been updated');
     },
     logError);


  },
 logError);
function createJoinQuery(joinListTitle,joinFieldName,projectedFields,joinType)
{
   var queryText = 
   "<View>" +
       "<Query/>" +
         "<ProjectedFields>";
    for(var idx in projectedFields) {
        queryText += String.format("<Field Name='{0}{1}' Type='Lookup' List='{0}' ShowField='{1}' />",joinListTitle,projectedFields[idx]);
    }
    queryText +=
         "</ProjectedFields>" +
         "<Joins>" +
             "<Join Type='{2}' ListAlias='{0}'>" +
                "<Eq>" +
                  "<FieldRef Name='{1}' RefType='Id'/>" +
                  "<FieldRef List='{0}' Name='ID'/>" +
                "</Eq>" +
             "</Join>" +
         "</Joins>" +
    "</View>";   
    var qry = new SP.CamlQuery();
    qry.set_viewXml(String.format(queryText,joinListTitle,joinFieldName,joinType));
    return qry;
}

function getListItems(listTitle,joinListTitle,joinFieldName,projectedFields,success,error)
{ 
   var ctx = SP.ClientContext.get_current();
   var web = ctx.get_web();
   var list =  web.get_lists().getByTitle(listTitle);
   var items = list.getItems(createJoinQuery(joinListTitle,joinFieldName,projectedFields,'INNER'));

   ctx.load(items);
   ctx.executeQueryAsync(
     function() {
       success(items);  
     },
     error
   );
}



function updateListItem(listTitle,itemId, propertiesToUpdate,success,error)
{
    var ctx = SP.ClientContext.get_current();
    var web = ctx.get_web();
    var list =  web.get_lists().getByTitle(listTitle);
    var listItem = list.getItemById(itemId);
    for(var name in propertiesToUpdate) {
        listItem.set_item(name,propertiesToUpdate[name]);   
    }
    listItem.update();
    ctx.executeQueryAsync(function() {
       success(listItem);
    },error);
}