这应该是一个非常简单的概念,但我只是不明白。在Titanium应用程序中,我有几个窗口使用的数据数组,我的xhr结果需要传递到我的应用程序命名空间的顶层才能添加到数组中。我可以成功解析onload函数中的JSON响应,但我想将我的数据代码与我的UI生成分开。
这是一个简化的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);
};
答案 0 :(得分: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上也有一些例子,也是
答案 1 :(得分:0)
我不确定你在问什么,但我确实看到了一个问题。您正在创建一个JSON对象,而不是一个myArray = JSON.parse(this.responseText);
的数组。对象没有.push()
方法,因此解释了 no help 注释。我还注意到您将其定义为array
,然后为其分配了JSON object
。