谷歌应用程序脚本 - 回调混乱

时间:2012-12-27 12:14:33

标签: google-apps-script

我对以下代码示例的行为感到困惑。 为什么我不能通过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;
}

3 个答案:

答案 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一起嵌入,这样当他做某事时,数据就会被发送回服务器

嵌入式垃圾被认为是隐藏的回调元素,用户不会与之交互,只是在下一个处理操作期间将其传递回服务器。正常'回调元素是服务器尚未知道的数据,例如表单元素(名称,地址等)。一旦用户点击提交按钮进行处理,就需要知道此信息,以便将其称为回调信息。

相关问题