我有这个 Sharepoint (2010) Javascript(改编自此处)在 ListItem 中插入或更新各种“字段”:
var listId;
. . .
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
listId = this.oListItem.ID;
oListItem.set_item('ptli_formFilledOut', new Date());
oListItem.set_item('ptli_TravelersName', $('travelername').val());
. . .
oListItem.update();
clientContext.load(oListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
在上面的代码中,第一个“upsert”存储了“listId”;随后写入列表(将逐个写入,以防用户停止或某些东西停止了他们,他们稍后会返回)使用 getItemById() 方法获取先前开始的 ListItem:
function upsertPostTravelListItemTravelerInfo2() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.oListItem = oList.getItemById(listId);
oListItem.set_item('ptli_tripNumber', $('tripnumber').val());
. . .
我的挑战是在用户想要在上面显示的两种方法中的第一种(upsertPostTravelListItemTravelerInfo1())中更新数据的第一位(他们插入这些数据,然后稍后返回并决定更改某些内容)的情况下。
我也需要在这里使用 getItemById() 。当这是第一个条目时,它还不存在,我使用:
listId = this.oListItem.ID;
...但是当这部分被更新时,将需要 listId 以便我可以:
this.oListItem = oList.getItemById(listId);
为此 - 为 listId 分配正确的值 - 我需要查询列表以查看某些值的“记录”是否已经存在,因此已经存在 listId;伪代码:
listId = //a "record" with a username value of "<userName>" and a payeeName of "<payeeName>" with a "Completed" value of "false")
if (listId == null) {
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
listId = this.oListItem.ID;
} else {
this.oListItem = oList.getItemById(listId);
}
我的问题是:我需要用什么替换该伪代码?如何像查询一样询问 Sharepoint 2010 ListItem 以找到特定 ListItem 成员值的匹配“记录”?
更新
基于 crclayton 的第一个想法,我在想:
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.website = context.get_web();
this.currentUser = website.get_currentUser();
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
var travelersEmail = $('traveleremail').val());
/* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem. */
listId = getListItemID(currentUser, travelersEmail);
if (listId === '') {
listId = this.oListItem.ID;
}
oListItem.set_item('ptli_formFilledOut', new Date());
oListItem.set_item('ptli_TravelersName', $('travelername').val());
oListItem.set_item('ptli_TravelersEmail', travelersEmail);
. . .
}
function getListItemID(username, payeename) {
var arrayListEnum = oList.getEnumerator();
while (arrayListEnum.moveNext()) {
var listItem = arrayListEnum.get_current();
if(listItem.get_item("ptli_formPreparedBy") === username &&
listItem.get_item("ptli_TravelersEmail") === payeename &&
listItem.get_item("ptli_formCompleted") == false) {
return listItem.get_id();
}
}
return '';
}
...可能是票。
更新 2
从答案中,我在这条线上得到了一个错误的消息:
var arrayListEnum = oList.getEnumerator();
即,“Uncaught TypeError: oList.getEnumerator is not a function”
是没有这样的名为getEnumerator()的函数,还是……???
更新 3
我仍然得到,“Uncaught TypeError: oList.getEnumerator is not a function”这个(修改过的)代码:
function getListItemID(username, payeename, oList) {
var clientContext = new SP.ClientContext.get_current();
var listItems = oList.getItems("");
clientContext.load(listItems);
clientContext.executeQueryAsync(function () {
var arrayListEnum = oList.getEnumerator();
while (arrayListEnum.moveNext()) {
var listItem = arrayListEnum.get_current();
if (listItem.get_item("userName") === "<userName>" &&
listItem.get_item("payeeName") === "<payeeName>" &&
listItem.get_item("Completed") == false) {
return listItem.get_id();
}
}
return '';
});
}
我这样称呼它:
function upsertPostTravelListItemTravelerInfo1() {
var clientContext = SP.ClientContext.get_current();
var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
this.website = clientContext.get_web();
currentUser = website.get_currentUser();
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = oList.addItem(itemCreateInfo);
var travelersEmail = $('traveleremail').val();
/* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem. */
listId = getListItemID(currentUser, travelersEmail, oList);
if (listId === '') {
listId = this.oListItem.ID;
}
那么 getEnumerator() 是不是一个有效的函数?如果是,我做错了什么?如果没有,我可以用什么代替它?