Передача результата xhr.onload - PullRequest
0 голосов
/ 28 мая 2011

Это должно быть очень простым понятием, но я просто не понимаю.В приложении Titanium у меня есть массив данных, используемый несколькими окнами, мой результат xhr должен быть передан на верхний уровень пространства имен моего приложения для добавления в массив.Я могу успешно проанализировать ответ JSON внутри функции 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.Я не хочу смешивать код пользовательского интерфейса с вызовами 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 ]

2 голосов
/ 30 мая 2011

Код выполняется асинхронно.Метка пытается сгенерировать до начала xhr.onload.

вы должны запустить событие из метода onload вашего кода.

событие будет иметь прослушиватель в разделе пользовательского интерфейсаваше приложение, и оно обеспечит надлежащее отделение кода http от кода пользовательского интерфейса;Примерно так:

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

и у меня есть несколько примеровна мой блог, http://blog.clearlyinnovative.com, также

0 голосов
/ 28 мая 2011

Я не совсем уверен, что вы спрашиваете, но я вижу проблему. Вы создаете объект JSON, а не массив с myArray = JSON.parse(this.responseText); У объекта нет метода .push(), поэтому поясняется комментарий no help . Я также заметил, что вы определили его как array, а затем присвоили ему JSON object.

...