2011-05-28 129 views
0

這應該是一個非常簡單的概念,但我只是不明白。在Titanium應用程序中,我有幾個窗口使用的數據數組,我的xhr結果需要傳遞到應用程序名稱空間的頂層以添加到數組中。我可以成功解析onload函數內部的JSON響應,但是我想將我的數據代碼與我的UI代分開。傳遞結果xhr.onload

這是一個簡化的app.js版本,以便我可以理解這個概念。不,我不會在我的真實應用程序中污染全局名稱空間。

Titanium.UI.setBackgroundColor('#000'); 
var myArray = []; 
var xhr = Titanium.Network.createHTTPClient(); 
xhr.onload = function() { 
    myArray = JSON.parse(this.responseText); 
    // var data = JSON.parse(this.responseText); // no help 
    // myArray.push(data); // no help 
    // return myArray; // no help 
}; 
xhr.onerror = function() { 
    Titanium.UI.createAlertDialog({ message:"Something has gone terrible wrong."}); 
}; 
xhr.open('GET','http://myapp.com/data.json'); 
xhr.send(); 
var win = Ti.UI.createWindow(); 
var view = Titanium.UI.createView({ 
    backgroundColor:'green' 
}); 
var caption = myArray[2].caption; 
var label = Ti.UI.createLabel({ 
    color:'white', 
    text:caption, 
    textAlign:'center' 
}); 
view.add(label); 
win.add(view); 
win.open(); 

感謝您的耐心等待!

編輯

這將產生從用戶的角度來看,正確的結果,但我想訪問的onload功能範圍之外的陣列。我不想讓UI代碼與API調用混合在一起。

xhr.onload = function() { 
    myArray = JSON.parse(this.responseText); 
    var caption = myArray[2].caption; 
    var label = Ti.UI.createLabel({ 
     color:'white', 
     text:caption, 
     textAlign:'center' 
    }); 
    view.add(label); 
}; 

回答

2

代碼正在異步運行。標籤試圖在xhr.onload開始之前生成。

你應該從你的代碼的onload方法中激發一個事件。

該事件將在您的應用程序的UI部分有一個監聽器,它將提供http代碼與ui代碼的適當分離;事情是這樣的

xhr.onload = function() { 
    myArray = Ti.App.fireEvent("app.updateLabel", 
         {"responseText":this.responseText}); 
}; 

在你的用戶界面,查看代碼

Ti.App.addEventListener("app.updateLabel",function(data) { 
    myArray = JSON.parse(data.responseText); 
    var caption = myArray[2].caption; 
    var label = Ti.UI.createLabel({ 
     color:'white', 
     text:caption, 
     textAlign:'center' 
    }); 
    view.add(label); 
}); 

更多的事件從appcelerator documentation

和我有my blog, http://blog.clearlyinnovative.com一些例子,也

0

我不完全確定你在問什麼,但我確實看到了問題。您正在創建一個JSON對象而不是數組myArray = JSON.parse(this.responseText);對象沒有.push()方法,因此解釋無幫助評論。我也注意到你將它定義爲array,然後爲它分配一個JSON object

+0

請參見新編輯代碼。 – 2011-05-28 19:26:25

+0

您是否已經無法在其外部訪問'myArray',我不明白爲什麼只要您已經定義了它,就無法進行操作。 'var myArray = {}' – bh88 2011-05-28 20:13:19

+0

如果(在我的onload函數之外)我嘗試'var caption = myArray [4] .caption',它是未定義的。如果我嘗試'var caption = myArray',它會產生'()',所以我相信這個數組是空的。 – 2011-05-28 20:30:37