2012-05-17 96 views
2

我正在使用KnockoutJS進行數據綁定。 下面的代碼是控制器的操作方法如何將JSON數組轉換爲JavaScript數組?

public JsonResult GetPeople() 
{ 
    var people = new List<Person> 
        { 
         new Person {Name = "aaaa", Address = "aaaaaaaaa"}, 
         new Person {Name = "bbbb", Address = "bbbbbbbbb"}, 
         new Person {Name = "cccc", Address = "ccccccccc"} 
        }; 
    return Json(people, JsonRequestBehavior.AllowGet); 
} 

而且波紋管的客戶端代碼片斷

<ul data-bind="foreach: people"> 
    <li>NAME:<span data-bind="text: Name"></span></li> 
    <li>ADDRESS:<span data-bind="text: Address"></span></li> 
</ul> 

<script> 
    function getPeopleFromServer() { 
     var people= []; 

     $.ajax({ 
      url: "GetPeople", 
      cache: false, 
      type: "GET", 
      success: function (result) { 
       console.log("result= " + result); 
       people = $.parseJSON(result); 
       console.log("people= " + people); 
      } 
     }); 

     return people; 
    } 

    function ViewModel() { 
     var self = this; 

     // data 
     self.people = ko.observableArray(getPeopleFromServer());   
    } 

    ko.applyBindings(new ViewModel()); 
</script> 

的問題是,人們在getPeopleFromServer方法變量總是空,而結果具有正確的價值服務器。 我錯過了什麼嗎?

+0

你從console.log得到了什麼(「result =」+ result); –

+0

您是否檢查過jQuery是否將解析結果解析爲JSON?您可以刪除'$ .parseJSON'並查看是否開始工作... – rjz

+1

'success'是一個內聯異步函數。基本上,'return people'發生在'success'函數被調用之前,因爲ajax調用是非阻塞的。您需要重新設計您的ViewModel以異步工作(或關閉異步),希望其他人可以用代碼修復編程 – Tom

回答

0

@湯姆的意見是正確的。

'success'是一個內聯異步函數。基本上,'return people'發生在'success'函數被調用之前,因爲ajax調用是非阻塞的。你需要重新設計你的ViewModel異步工作(或者關閉異步),希望其他人能夠修復代碼

這裏是他預言的完全註釋小提琴。

http://jsfiddle.net/bczengel/8Wqum/

1

$.ajax功能需要更長的時間來完成比它包含的功能,所以包含函數永遠不會被執行結束popuplates people

一個你可以做的事情就是添加以下到您的$.ajax

$.ajax({ 
    async: false, 
    url: "GetPeople", 
    ..... 
}); 

async: false將使包含功能'等待',直到ajax完成。你的人員var應該在函數執行結束時填充。雖然這是一個快速獲勝,但我同意Tom你應該重新考慮如何處理你的ViewModel。

+0

感謝您的回覆Martin,我添加了「async:false」,但是人們仍然爲空,而結果不爲空。 – Ray

0

人們應該被引用到相同的視圖模型。或作爲self.people。我建議你將視頻模型中的ajax調用放到視圖模型中,然後就可以清楚了。 所以getPeopleFromServer()應該在viewmodel中。

出於興趣,您還可以添加 超時:600000,以便呼叫不超時。