2013-03-05 47 views
0

從以前的問題回答我在這裏問了一個問題給我帶來了另一個問題,因爲我越來越多地瞭解異步調用,我仍然無法確定如何完成(如前面的答案所示)列表允許我存儲和使用選定列表項目中的數據。返回或結構代碼,所以來自ajax調用的數據可以用在動態填充列表中

$('#home').live('pageshow', function(){ 
    // creating object 
    var customerList = JSON.parse('{"customerInAccount":[{"customer_name":"Jane Doe","auto_id":"21"},{"customer_name":"Jack Black","auto_id":"22"}]}'); 

    // creating html string 
    var listString = '<ul data-role="listview" id="customerList">'; 

    // running a loop 
    $.each(customerList.customerInAccount, function(index,value){ 
    listString += '<li><a href="#" data-cusid='+this.auto_id+'>'+this.customer_name+'</a></li>'; 
    }); 
    listString +='</ul>'; 

    console.log(customerList); 

    //appending to the div 
    $('#CustomerListDiv').html(listString); 

    // refreshing the list to apply styles 
    $('#CustomerListDiv ul').listview(); 

    // getting the customer id on the click 
    $('#customerList a').bind('click',function(){ 
    var customerID = $(this).data('cusid'); 
    alert(customerID); 
    }); 
}); 

與爵士小提琴http://jsfiddle.net/amEge/3/

此代碼的工作出色,可以讓我實現我想要什麼,但我的拳頭需要從Ajax調用填充customerList。但從「成功」功能,我似乎無法讓代碼工作。

$.post(postTo,{id:idVar} , function(data) { 

    customerList = data; 
    //alert(customerList); 
}) 

當我將代碼移到ajax函數中時,它不起作用。我只是想知道是否有人可以幫助我,也許告訴我如何從異步調用處理這個問題?

很多謝謝

+0

您可以添加一些關於您正在調用的數據源,其響應的格式,它在響應中設置的內容類型等信息。 – 2013-03-05 04:38:07

+1

當您說它不起作用時,請詳細說明發生?我看不出爲什麼會失敗。你有沒有收到任何錯誤信息?在AJAX成功處理程序中,當您嘗試提醒時會發生什麼,比如說customerList [0] [0]? – Jodes 2013-03-05 04:38:13

+0

在firebug中查看'post'響應,並在'find'的幫助下提取任何您需要的內容... – Deadlock 2013-03-05 04:38:59

回答

1

你需要改變你的頁面如下。

// I assume this is your dot net web service url 
var webServiceURL = 'customer.asmx/GetCustomer'; 

// here home is your page's ID 
$('#home').live('pageshow', function(){ 
    getCustomerList(); 

}); 

function getCustomerList(){ 
    param=JSON.strigify({id:'2'}); 
    callWebService(param, webServiceURL, onGetCustListSuccess, onGetCustListFailed) 
} 

function onGetCustListFailed(){ 
    alert("service request failed"); 
} 

function onGetCustListSuccess(data, status){ 
    // creating object 
    // replace previous line with below 
    // var customerList = JSON.parse('{"customerInAccount":[{"customer_name":"Jane Doe","auto_id":"21"},{"customer_name":"Jack Black","auto_id":"22"}]}'); 
    var customerList = JSON.parse(data.d); 

    // creating html string 
    var listString = '<ul data-role="listview" id="customerList">'; 

    // running a loop 
    $.each(customerList.customerInAccount, function(index,value){ 
    listString += '<li><a href="#" data-cusid='+this.auto_id+'>'+this.customer_name+'</a></li>'; 
    }); 
    listString +='</ul>'; 

    console.log(customerList); 

    //appending to the div 
    $('#CustomerListDiv').html(listString); 

    // refreshing the list to apply styles 
    $('#CustomerListDiv ul').listview(); 

    // getting the customer id on the click 
    $('#customerList a').bind('click',function(){ 
    var customerID = $(this).data('cusid'); 
    alert(customerID); 
    }); 
} 

function callWebService(param,url,successFunc,errorFunc){ 
    if(errorFunc=='undefined'){ 
     errorFunc=OnDataError; 
    } 
    $.ajax({    
      type: "POST", 
      url: url, 
      data: param, 
      contentType:"application/json; charset=utf-8", 
      dataType: "json", 
      success: successFunc, 
      error: errorFunc, 
      beforeSend:function(){$.mobile.loading('show');}, 
      complete:function(){$.mobile.loading('hide');} 
    }); 
} 

希望這會幫助你。如果你有問題在這裏問我。

+0

確定它仍然無法工作,爲了理解執行順序,我在整個代碼中提醒您。但是我沒有深入調用WebService函數,也不理解代碼的「successFunc」部分。任何更多的幫助將不勝感激,我正在使用你給我的上一個答案的基本代碼佈局。 .live功能運行良好,因此我相信我的頁面結構正確。也感謝你的答案,我從你如何構造你的代碼中學到很多東西。謝謝 – user1668630 2013-03-05 05:29:56

+0

請檢查執行停止的地方。簡單的做法是在每個函數中放置一個alert('test1')'。同時按下'f12'並查看瀏覽器控制檯中記錄的任何錯誤。 – 2013-03-05 05:38:43

+0

我通過函數發出警報,並注意到param變量導致錯誤,但並不認爲這是問題,因爲我只是在php腳本中使用固定變量進行調試。現在我在JSON.parse(data.d)代碼行上得到了「Unexpected token u」。另外爲什麼它現在被命名爲「data.d」? – user1668630 2013-03-05 05:52:59

0

糾正我,如果我錯了,但我會大膽地猜測你的「活」的代碼看起來是這樣的:

$('#home').live('pageshow', function(){ 
    // creating object 
    var customerList; 

    $.post(postTo, {id:idVar}, function(data) { 
     customerList = data; 
     //alert(customerList); 
    }); 

    // creating html string 
    var listString = '<ul data-role="listview" id="customerList">'; 

    // and all the rest... 

如果是這樣,那麼你的問題是,這取決於是代碼您的customerList變量被填充(「所有剩下的......」)立即運行,而不是等待HTTP請求的響應從Web服務器返回。 $ .post()不會等待(或者像我們在計算機軟件編程遊戲中所說的那樣「阻止」),而HTTP事務則進入Web服務器並返回。相反,其餘的代碼會立即運行,然後當響應返回到瀏覽器時,JavaScript引擎忠實地執行您的成功函數(或「關閉」,就像我們嗯嗯)。

所以你想要做的就是把所有這些其他代碼(依賴於customerList的東西)放到一個單獨的函數中,然後在你的成功關閉中調用該函數。你甚至不需要你的customerList變量;你可以將新的響應數據作爲參數傳遞給你的新函數。

+0

你100%正確,謝謝你的解釋清楚。很有幫助。 – user1668630 2013-03-05 05:55:01

相關問題