2013-02-22 46 views
0

我試圖構建一個Windows8應用程序,我使用SplitApp作爲基礎。試圖從AJAX添加數據但失敗。如何使用javascript在windows8中填充列表

在文件data.js我有:

(function() { 

    var list = new WinJS.Binding.List(); 

    $.each(data(), function (key, item) { 
     list.push(item); 
    }); 

} 
})(); 

在文件app.js我有(這工作,並填充在應用程序列表)

function data() { 

    var testGroupMeeting = []; 
    var testMeeting = []; 

    testGroupMeeting.push(new Group({ id: "1", title: "Group1" })); 

    testMeeting.push(new Meeting({ group: testGroupMeeting[0], title: "Item Title: 1"  })); 

    return testMeeting; 


} 

但是,當我想使用AJAX獲取數據,並在它填充崩潰時返回testMeeting。

在文件app.js我有(不工作),但我需要得到這個工作

function data() { 

    var testGroupMeeting = []; 
    var testMeeting = []; 

$.ajax({ 
    url: "/json/json.php", 
    dataType: 'json', 
    contentType: 'text/json', 
    type: 'GET', 
    success: function (data) { 

      //Data here is correct and mapped to the arrays, its the same as in the abow example, i have the same data in the arrays as in the above example 



     } 
     return testMeeting; 
    } 

}); 


} 

但問題似乎是AJAX是不應該被返回任何東西。我不能做一個回調data.js,因爲這個函數是匿名的,你可以看到。

你會如何做到這一點?

回答

0

這樣做不能這樣工作,因爲$ .ajax函數是異步的:它執行ajax調用,然後用相應的數據調用「success」函數。

您將重寫$ .each(data()...,以便不要調用data()並期望它返回testMeeting,而是調用數據並期望它使用testMetting對象調用回調。

喜歡的東西:

(function() { 

    var list = new WinJS.Binding.List(); 

    getData(function (theMetting) { 


     $.each(theMeeting, function (key, item) { 
      list.push(item); 
     }); 

} 
})(); 


// callback is a function that will be called with 
// something that is built from the server, after the ajax 
// request is done 
function getData(callback) { 


$.ajax({ 
    // ... everything you did ... 
    success: function (data) { 

     // ... use the data to build the meeting object 
     // and pass it to the callback 
     callback(meeting) 


    } 
    return testMeeting; 
} 

}); 

} 

有同步碼(即返回功能)和asynchonous電話(即做了一些工作,後來與結果調用回調函數)之間的根本區別$阿賈克斯是。典型的異步功能

理論上可以通過將「async」標誌傳遞給ajax,以便在Ajax調用完成之前$ .ajax函數不會返回,但您可能不想這樣做,因爲它會阻止您的UI。

希望這有助於。

+0

的問題是的getData(函數(theMetting){ $。每個(theMeeting,功能(鍵,項目){ list.push(項目); }); }是匿名函數默認情況下來自微軟,我無法像你所建議的那樣從我的app.js中訪問它,或者? – rubin 2013-02-22 14:54:09

+0

不,getData只是你可以寫的功能而不是「數據」函數,我假設所有的代碼都是你的 - 如果無法從data.js中更改函數,並且修改應用程序的唯一方法是定義「數據」函數,那麼必須對服務器進行同步(* not * asynchronous)調用 - 您可以通過向$ .ajax函數傳遞一個標誌來實現,然後$ .ajax樂趣ction會一直等到「成功」回調已經完成... – phtrivier 2013-02-22 14:59:00

+0

現在,明確地說,我並不真正理解「在默認情況下來自ms的缺省函數中」的含義。我只能告訴你,$ .each(data(),....)版本只有在data()*返回一個數組時纔會起作用,並且你將不能寫一個返回數據的函數從異步調用到服務器。要麼讓它成爲同步調用,要麼重寫循環以適應它。希望這有助於。 – phtrivier 2013-02-22 15:05:26