我有一个提交按钮,其启用状态取决于其他几个小部件的状态;我无法在Google Apps脚本中提出客户端解决方案来进行验证。
例如,取三个复选框。如果f(if-and-only-if)启用了至少一个复选框,则应启用提交按钮。
我知道我可以通过服务器端验证来做到这一点但是不应该有这么简单的事情。有什么建议?感谢。
答案 0 :(得分:2)
完全可以编写依赖于多个小部件状态的客户端处理程序,因为您可以在单个处理程序上链接许多validateX
调用。这里的问题只是clientHandlers
无法验证复选框状态。
我已经针对此问题提出了一个问题,您可能希望对其进行加星标记以跟踪更新及其投票类型:
Issue 2220: UiApp handler validateValue of checkbox
无论如何,有可能解决这个问题,我只是告诉你可以根据多个小部件的值来拥有处理程序,但是当问题2220解决时,这段代码会更简单:
function doGet(e) {
var app = UiApp.createApplication().setTitle('Checkbox Test');
var panel = app.createVerticalPanel(),
noChecked = app.createClientHandler(),
button = app.createButton('Test').setEnabled(false);
for( var i = 0; i < 3; ++i ) {
var cb1 = app.createCheckBox('cb'+i),
cb2 = app.createCheckBox('cb'+i).setVisible(false),
tb = app.createTextBox().setValue('false').setVisible(false);
cb1.addClickHandler(app.createClientHandler().forTargets(cb2).setValue(true).setVisible(true).forEventSource().setVisible(false).forTargets(tb).setText('true'));
cb2.addClickHandler(app.createClientHandler().forTargets(cb1).setValue(false).setVisible(true).forEventSource().setVisible(false).forTargets(tb).setText('false'));
cb1.addClickHandler(app.createClientHandler().forTargets(button).setEnabled(true));
cb2.addClickHandler(noChecked.validateMatches(tb,'false'));
panel.add(cb1).add(cb2).add(tb);
}
noChecked.forTargets(button).setEnabled(false);
return app.add(panel.add(button));
}
答案 1 :(得分:0)
ClientHandler故意简单。您可以使用ServerHandler执行任意代码,速度差异应该相对较小。否则,是的,这是设计的,如果您需要更复杂的客户端逻辑,则需要使用HtmlService。
UiApp和HtmlService之间的权衡与我们如何保证您无法从脚本提供恶意代码有关。 UiApp代码使用限制但绝对安全的简单构建器模式,而HtmlService使用复杂的沙盒来实现该目标,权衡不适用于旧浏览器和其他一些限制。
如果我理解正确的话,这个特定用例在UiApp中听起来是可行的。如果你想要一个翻转的显示/隐藏按钮的例子,这里有一个:
function doGet() {
var app = UiApp.createApplication();
var label = app.createLabel("I am a toggleable widget").setVisible(false);
var show = app.createButton("show");
var hide = app.createButton("hide").setVisible(false);
show.addClickHandler(app.createClientHandler()
.forTargets(label, hide).setVisible(true).forTargets(show).setVisible(false));
hide.addClickHandler(app.createClientHandler()
.forTargets(label, hide).setVisible(false).forTargets(show).setVisible(true));
return app.add(show).add(hide).add(label);
}
基本上,使用2个按钮并翻转按钮的可见性。
复选框实际上已经过验证 - 但是验证了它们的文本,而不是它们的值:
var app = UiApp.createApplication();
var check = app.createCheckBox();
check.setText("foo").addClickHandler(
app.createServerHandler("clicked").validateMatches(check, "foo"));
return app.add(check);
问题跟踪器请求是合理的。