2013-10-03 3 views
0

Есть ли другой способ обновить gui, чем return app;?использовать приложение возврата; без окончания текущей функции

Я хочу установить текст на ярлыке, прежде чем делать выборку URL-адреса, например, начать загрузку, и после того, как он завершает работу, поменяйте ярлык на завершение загрузки.

function EventHandler(e) { 
    var app = UiApp.getActiveApplication(); 
    var url = e.parameter.URLInput; 
    var label = app.getElementById("label"); 
    label.setText("Download started"); 
    try{ 
    var file = UrlFetchApp.fetch(url).getBlob(); 
    } catch(err){ 
    label.setText(err); 
    } 
    label.setText("Download finished"); 
    return app; 
} 

Метка остается пустым, пока UrlFetchApp не будет завершена, а затем содержание лейбла является "Загрузка закончена. Добавление return app; до того, как выборка завершит выполнение функции.

ответ

1

Вы должны использовать clientHandler для установки текста на ваш ярлык в функции doGet, клиентHandler выполняется немедленно, когда вы нажимаете кнопку.

Вот тест приложение, которое показывает, как это работает: (online test available here с имитацией загрузки)

function doGet(){ 
    var app = UiApp.createApplication(); 
    var label = app.createLabel('---empty---').setId('label'); 
    app.add(label) 
    var handler = app.createServerHandler('EventHandler'); 
    var cHandler = app.createClientHandler().forTargets(label).setText('starting download'); 
    var btn = app.createButton('start',handler).addClickHandler(cHandler); 
    app.add(btn); 
    return app; 
} 



function EventHandler(e) { 
    var app = UiApp.getActiveApplication(); 
    var url = e.parameter.URLInput; 
    var ulabel = app.getElementById("label"); 
    ulabel.setText("Download started"); 
    try{ 
    //var file = UrlFetchApp.fetch(url).getBlob(); 
    } catch(err){ 
    label.setText(err); 
    } 
    ulabel.setText("Download finished"); 
    return app; 
} 

Примечание: вы можете использовать один и тот же обработчик клиента, чтобы сделать много других полезных вещей: отключить кнопку, показать прядильщик ... все, что вам нравится, должно происходить в функции doGet без задержки.


EDIT следующий комментарий

Вы пробовали использовать 2 обработчики сервера параллельно? в displayHandler вы можете настроить любое условие, которое вы хотите, я оставил его простым в следующем примере:

function doGet(){ 
    var app = UiApp.createApplication(); 
    var label = app.createLabel('---empty---').setId('label'); 
    app.add(label) 
    var handler = app.createServerHandler('EventHandler'); 
    var displayHandler = app.createServerHandler('displayHandler'); 
    var btn = app.createButton('start',handler).addClickHandler(displayHandler); 
// you can add other handlers (keypress, hover... whatever) they will all execute at the same time 
    app.add(btn); 
    return app; 
} 

function displayHandler(e) { 
    var app = UiApp.getActiveApplication(); 
    var ulabel = app.getElementById("label"); 
    ulabel.setText("Download started"); 
    return app; 
} 

function EventHandler(e) { 
    var app = UiApp.getActiveApplication(); 
    var url = e.parameter.URLInput; 
    var ulabel = app.getElementById("label"); 
    try{ 
    Utilities.sleep(2000);// simulating download 
    } catch(err){ 
    label.setText(err); 
    } 
    ulabel.setText("Download finished"); 
    return app; 
} 
+0

Привет, спасибо за ваш ответ. У меня уже есть это для нажатия кнопки, но как это сделать для нажатия клавиши? Обработчик клиента довольно ограничен в том, что он может сделать, и afaik я могу проверить только на keyCode == 13 внутри обработчика событий сервера. Я уже использую отключение кнопки и текстового поля :) – MarijnS95

+0

Когда я отвечаю на сообщение здесь, я никогда не знаю, что такое «технический уровень» парня, который написал вопрос (особенно когда это новый пользователь SO) ... на этот раз я явно разговаривал с человеком, который знает, о чем он говорит :-) мое удовольствие! Тем не менее я предложил еще один возможный способ сделать то, что вы хотите, скажите, если это произойдет. –

+0

Привет, Серж, спасибо за вашу реакцию! Я просто реализовал это в своей программе, и он делает именно то, что я хочу! Я также сделал кнопку активировать обработчик сервера для отображения, поэтому время отклика остается одинаковым (это выглядит немного неудобно, когда нажатие на возврат занимает некоторое время, прежде чем текстовое поле и кнопка деактивируются, а текст ярлыка изменился, а нажатие кнопки делает это в одно мгновение). – MarijnS95

Смежные вопросы