尝试使用javascript更新Sharepoint列表时出错

时间:2012-09-16 18:03:35

标签: javascript asp.net sharepoint

更新

我现在尝试了一种新方法。这可以在我调用它一次时起作用,但第二次它告诉我该集合由于某种原因尚未启动。此代码段的测试功能中的注释将澄清我的问题。

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

3 个答案:

答案 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;
}