更新
我现在尝试了一种新方法。这可以在我调用它一次时起作用,但第二次它告诉我该集合由于某种原因尚未启动。此代码段的测试功能中的注释将澄清我的问题。
使用Javascript:
function test(){
//this first call works
countRetrieve('Very', 'Difficult');
//this second call generates error that collListItem hasnt been initiated
countRetrieve('Less', 'Interesting');
}
function countRetrieve(grade, title) {
var siteUrl = '/sites/MySite';
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('Summary');
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><Query><Where>' +
'<And>' +
'<Eq><FieldRef Name=\'Grad\'/><Value Type=\'Text\'>' +
grade +
'</Value></Eq>' +
'<Eq><FieldRef Name=\'Title\'/><Value Type=\'Text\'>' +
title +
'</Value></Eq>' +
'</And>' +
'</Where></Query></View>');
this.collListItem = oList.getItems(camlQuery);
clientContext.load(collListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onRetrieveQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onRetrieveQuerySucceeded(sender, args) {
listItemEnumerator = collListItem.getEnumerator();
while (listItemEnumerator.moveNext()) {
var oListItem = listItemEnumerator.get_current();
itemId = oListItem.get_id();
itemCount = oListItem.get_item('Count');
}
updateCount();
}
function updateCount() {
var clientContext = new SP.ClientContext('/sites/MySite');
var oList = clientContext.get_web().get_lists().getByTitle('Summary');
this.oListItem = oList.getItemById(itemId);
//update the count, raise it by one
var c = itemCount + 1;
oListItem.set_item('Count', c);
oListItem.update();
clientContext.executeQueryAsync(Function.createDelegate(this, this.onUpdateSucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onUpdateSucceeded(sender, args){
alert('item count updated');
}
我试图检索列表中“Count”列的当前值,然后将此值上升1.但是我得到一个错误,告诉我Collection尚未初始化。
它是否在 this.collListItem = oList.getItems(camlQuery); ?
中初始化这个功能可能是完全错误的,我非常感谢有关如何执行此任务的提示,因为我对Sharepoint和Javascript都很新。
这是我的代码(javascript):
function countUpdate() {
var siteUrl = '/sites/MySite';
var clientContext = new SP.ClientContext(siteUrl);
var oList = clientContext.get_web().get_lists().getByTitle('Summary');
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><Query><Where>' +
'<And>' +
'<Eq><FieldRef Name=\'Grade\'/><Value Type=\'Text\'>' +
'Really' +
'</Value></Eq>' +
'<Eq><FieldRef Name=\'Property\'/><Value Type=\'Text\'>' +
'Narrow' +
'</Value></Eq>' +
'</And>' +
'</Where></Query></View>');
this.collListItem = oList.getItems(camlQuery);
clientContext.load(collListItem);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onUpdateQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
//update
var listItemEnumerator = collListItem.getEnumerator();
while (listItemEnumerator.moveNext()) {
var oListItem = listItemEnumerator.get_current();
var count = oListItem.get_item('Count');
oListItem.set_item('Count', '40');
oListItem.update();
}
clientContext.executeQueryAsync(Function.createDelegate(this, this.onUpdateQuerySucceeded),Function.createDelegate(this, this.onQueryFailed));
}
答案 0 :(得分:1)
回答你的问题在于AJAX的异步性质。您的电话已经完成,其他代码会在返回之前立即继续。所以你需要的是一个“处理程序” - 一个在你的请求完成时调用的函数,它将处理它返回的数据。
executeQueryAsync将第一个参数作为方法(一个函数)“succeededCallback” - 你需要创建该方法并将其赋予此调用(没有parens - 你想传递对函数的引用,而不是运行它) 。当请求完成时,将自动调用该方法,并自动将调用结果作为第一个参数包含在内。
查看您的代码并尽可能简化您将需要将三个函数链接在一起:
1)设置初始呼叫,完成呼叫2)。
2)接受初始呼叫的结果,对其进行操作,设置第二个呼叫以及完成呼叫时3)
3)接受第二次电话会议的结果,对他们采取行动。
你可以使用内置的SP功能但老实说我发现它们有点麻烦。我在这里建立了自己的AJAX抽象:
http://depressedpress.com/javascript-extensions/dp_ajax/
实施有点不同,但想法完全相同 - 或许通过一些例子来看,可能会让事情变得更加清晰。
希望这会有所帮助。对于小小的人来说,值得你们好好合作:这是其中之一“没有人得到它,直到他们真正得到它”这些东西似乎是第一次漂亮的任何人的绊脚石。
答案 1 :(得分:0)
你需要在onUpdateQuerySucceeded函数中继续执行 - 在该列表之前没有任何信息,因为在你获得项目之前需要将请求发送到服务器并且响应被清空。
由于这个原因,函数被称为XXXXAsync - 调用它不会立即给出结果,而是在成功回调中异步调用。
答案 2 :(得分:0)
感谢Jim的回答。不仅问题所有者发现您的帖子有用。
为了方便起见,我发布了一个示例:
此代码可以通过单击SPListItem
CheckBox
var appOpsUrl = '/sites/AppOpsRep';
var coll;
function UpdateTargetInReport(checkBox, refValueOne, refValueTwo)
{
var clientContext = new SP.ClientContext.get_current();
var list = clientContext.get_web().get_lists().getByTitle('SLA Fulfillment');
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><Query><Where><And><Eq><FieldRef Name=\'Application\' /><Value Type=\'Text\'>' + refValueOne + '</Value></Eq><Eq><FieldRef Name=\'Metric_x0020_name\' /><Value Type=\'Text\'>' + refValueTwo + '</Value></Eq></And></Where></Query></View>');
coll = list.getItems(camlQuery);
clientContext.load(coll);
clientContext.executeQueryAsync(Function.createDelegate(this, function(){ UpdateTargetInReport_onQuerySucceeded(refValueTwo, checkBox); }), Function.createDelegate(this, function(sender,args) { UpdateTargetInReport_onQueryFailed(sender, args, checkBox); }));
}
function UpdateTargetInReport_onQuerySucceeded(refValueTwo, checkBox)
{
var clientContext = new SP.ClientContext.get_current();
var listItemEnumerator = coll.getEnumerator();
while(listItemEnumerator.moveNext())
{
var listItem = listItemEnumerator.get_current();
listItem.set_item('In_x0020_Report', checkBox.checked);
listItem.update();
}
clientContext.executeQueryAsync(Function.createDelegate(this, function() { UpdateTargetInReport_onUpdateQuerySucceeded(refValueTwo); }), Function.createDelegate(this, function(sender,args) { UpdateTargetInReport_onUpdateQueryFailed(sender, args, checkBox); } ));
}
function UpdateTargetInReport_onQueryFailed(sender, args, checkBox)
{
SP.UI.Notify.addNotification('Request failed. ' + args.get_message());
checkBox.checked = !checkBox.checked;
}
function UpdateTargetInReport_onUpdateQuerySucceeded(refValueTwo)
{
SP.UI.Notify.addNotification(refValueTwo + ' updated successfully');
}
function UpdateTargetInReport_onUpdateQueryFailed(sender, args, checkBox)
{
SP.UI.Notify.addNotification('Request failed. ' + args.get_message());
checkBox.checked = !checkBox.checked;
}