我对以下代码示例的行为感到困惑。 为什么我不能通过app对象在回调中访问statusLabelU?
可在参数
中找到BTW,回调中参数变量e的类型是什么?
function doGet() {
var app = UiApp.createApplication();
var button = app.createButton('Enter Symbol');
app.add(button);
var symbolText = app.createTextBox().setName('symbolText').setId('symbolText');
app.add(symbolText);
var labelU = app.createLabel('Unknown symbol U')
.setId('statusLabelU');
var labelK = app.createLabel('Unknown symbol K')
.setId('statusLabelK');
app.add(labelU);
app.add(labelK);
var handler = app.createServerHandler('myClickHandler');
handler.addCallbackElement(symbolText);
button.addClickHandler(handler);
return app;
}
function myClickHandler(e) {
var app = UiApp.getActiveApplication();
var symU = app.getElementById('symbolText');
var symK = e.parameter.symbolText;
var financeU = FinanceApp.getStockInfo(symU);
var financeK = FinanceApp.getStockInfo(symK);
var label = app.getElementById('statusLabelU');
label.setText(financeU.name);
var label = app.getElementById('statusLabelK');
label.setText(financeK.name);
app.close();
return app;
}
答案 0 :(得分:1)
如果你跑
labelU.setName('labelU');
handler.addCallbackElement(labelU);
您将能够像这样访问回调中的标签值:
var value = e.parameter.labelU;
参数'e'(或'eventInfo')包含有关如何触发回调的信息。有一些关于用户ID,游标的x / y位置以及触发回调的源元素的一般信息。除此之外,显式添加到处理程序的窗口小部件的值可以作为参数访问。您可以随时查看内容
Logger.log(E);
并从编码环境中查看日志(cmd / ctrl + return)。
答案 1 :(得分:0)
实际上,您可以通过app对象访问回调中的statusLabelU。除了通过addCallbackElement将它作为参数传递给事件处理程序之外,你不能做什么(至少我不知道任何方式)访问TextBox的内容(你也可以将容器传递给addCallbackElement,然后是这个容器中的所有元素)被传递给你的事件处理程序)。那么你的例子会发生什么:
var symU = app.getElementById('symbolText');
返回TextBox的一种代理,当转换为字符串'Generic'时返回。
FinanceApp.getStockInfo('Generic');
然后依次返回undefined,然后将其设置为标签statusLabelU的文本。
答案 2 :(得分:0)
是的,我花了一段时间才明白发生了什么。我最终理解的方式是:
服务器处理内容,然后向客户端提供UI。每次客户端执行某些操作(例如单击按钮)时,他会将此内容提交给服务器,但服务器无法记录之前所执行的操作,因此您在向客户端提供UI之前所做的所有变量都不再是知道。
因此,如果您希望服务器在服务客户端之前记住它们创建的那些值,那么您需要将它们与发送到客户端的UI一起嵌入,这样当他做某事时,数据就会被发送回服务器
嵌入式垃圾被认为是隐藏的回调元素,用户不会与之交互,只是在下一个处理操作期间将其传递回服务器。正常'回调元素是服务器尚未知道的数据,例如表单元素(名称,地址等)。一旦用户点击提交按钮进行处理,就需要知道此信息,以便将其称为回调信息。