2012-09-16 62 views
0

更新錯誤嘗試更新的JavaScript

現在我已經嘗試了新的方法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'); 
} 

我試着去找回我的列表列「計數」的當前值,然後通過1上升這個數值但是我得到告訴我一個錯誤的集合沒有已初始化。

Did not get initial in 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

發佈最新更新多個SPListItem的I _think_你的問題就是範圍界定......很刺。這個「這個」關鍵字是非常棘手的(值得研究一下)。重點是「this」 - 這裏 - 實際上是對函數OWNER的引用 - 換句話說,就是窗口對象。從本質上講,它使「collListItem」一個全局變量...調用處理程序,因爲新功能應該處理,但我老實說不知道「Function.createDelegate」是什麼 - 我不熟悉這種用法,但它似乎很拗口對我來說。 –

+0

另一個問題可能是在「onRetrieveQuerySucceeded」中全局設置了「listItemEnumerator」 - 但我認爲這不是您考慮您的錯誤的當前問題,但我可以稍後看到它是一個問題。 –

+0

這裏有一個很好的「這個」的概述 - 但我讀了幾個 - 這是一個棘手的: http://justin.harmonize.fm/index.php/2009/09/an-introduction-to-javascripts-this/ –

回答

1

由於回答你的問題在於AJAX的異步性。您的通話已完成,其他代碼立即繼續返回。所以你需要的是一個「處理程序」 - 當你的請求完成時會調用一個函數來處理它返回的數據。

executeQueryAsync將第一個參數作爲方法(函數)「succeededCallback」 - 您需要創建該方法並將其傳遞給此調用(沒有parens - 您想要傳遞函數的引用,而不是運行它)。該方法將在請求完成時自動調用,並且會自動將該調用的結果作爲第一個參數。

看你的代碼,併爲儘可能簡單化你將不得不鏈在一起的三個功能:

1)建立初始呼叫,當完成呼叫2)。

2)接受從初始呼叫的結果,在他們的行爲,建立第二呼叫和呼叫完成3)當

3)接受來自所述第二呼叫的結果,在他們的行爲。

你可以使用內置的SP功能,但老實說,我覺得他們有點麻煩。我建立了我自己的AJAX abstrction在這裏做到這一點:

http://depressedpress.com/javascript-extensions/dp_ajax/

實現是有點不同,但思路是完全一樣的 - 也許是通過一些例子有可能帶來的東西到更清晰的焦點看。

希望這會有所幫助。對於那些值得你成爲好公司的人來說,這是一個「沒有人能得到它,直到他們真正得到它」的東西,這對於任何人來說似乎都是第一次碰到的絆腳石。

+0

謝謝你的回答,我會再看看這個。遲早我會得到它的盼望,我希望。 – user1666361

+0

看到我上面的更新,有什麼想法? – user1666361

0

您需要繼續onUpdateQuerySucceeded函數執行 - 在此之前,名單不會有任何信息的請求需要被髮送到服務器並響應hamdled才把項目。

這些函數完全是出於這個原因被稱爲XXXXAsync - 調用它並不立即給出結果,而是在成功回調中異步執行。

+0

謝謝你的回答。從onUpdateQuerySucceeded()我現在調用另一個函數updateCount(),它應該遍歷檢索的列表項並更新count-column值。 – user1666361

+0

但是,我收到一個錯誤,說集合尚未初始化。我如何將檢索到的集合傳遞給這個新函數?全局變量? – user1666361

0

感謝您的回答吉姆。不僅問題所有者認爲您的帖子有用。

要easien東西我張貼的樣本: 該代碼可以通過點擊一個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; 
} 
相關問題