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

Update ProjectedField with JOIN in Sharepoint using Javascript client object model

假设我有 2 个列表:TeamsEmployees。每个团队有若干员工:

Teams
  ID
  Name

Employees
  ID
  Name
  TeamID (foreign key of Teams)

如果我创建了 Employees LEFT JOIN Teams 的加入查询,那么我可以 set_itemupdate 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);

然后,更新 TeamName 字段:

var first = listItemsCollection.get_data()[0];
first.set_item("TeamName", "something");
first.update();

ctx.executeQueryAsync(onSuccess, onError);

支持吗? (我目前还没有办法尝试这个)

如果不行,还有什么选择?

不,只能更新包含 列表项的那些字段。但是您可以考虑使用以下方法来更新 投影字段

由于投影字段作为 查找值 返回,您可以检索 projected 列表项并更新其属性,如下所示:

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);
}