1

有効化状態が他のいくつかのウィジェットの状態に依存する送信ボタンがあります。そして、検証を行うためにGoogleAppsScriptでクライアント側のソリューションを思い付くことができません。

たとえば、3つのチェックボックスを取ります。送信ボタンは、少なくとも1つのチェックボックスが有効になっている場合にのみ有効にする必要があります。

サーバー側の検証でこれを実行できることはわかっていますが、これほど単純なものは必要ないはずです。助言がありますか?ありがとう。

4

2 に答える 2

2

validateX1つのハンドラーで多くの呼び出しをチェーンできるため、複数のウィジェットの状態に依存するクライアント側ハンドラーを作成することは完全に可能です。ここでの問題は、clientHandlersチェックボックスの状態を検証できないことです。

私はこの問題に関する問題を開きました。更新と投票の種類を追跡するために、スターを付けることをお勧めします。

問題2220:チェックボックスのUiAppハンドラーvalidateValue

とにかく、これを回避することは可能であり、複数のウィジェットの値に応じてハンドラーを持つことが可能であることを示すだけですが、問題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));
}
于 2012-12-19T19:25:15.610 に答える
0

ClientHandlerは意図的に単純です。ServerHandlerを使用して任意のコードを実行でき、速度の差は比較的小さいはずです。それ以外の場合、はい、これは仕様によるものであり、より複雑なクライアントロジックが必要な場合は、HtmlServiceを使用する必要があります。

UiAppとHtmlServiceの間のトレードオフは、スクリプトから悪意のあるコードを提供できないことを保証する方法に関連しています。UiAppコードは、制限はあるが間違いなく安全な単純なビルダーパターンを使用しますが、HtmlServiceは複雑なサンドボックスを使用してその目標を達成しますが、古いブラウザーでは機能しないというトレードオフやその他の制限があります。

私があなたを正しく理解していれば、この特定のユースケースはUiAppで実行可能に聞こえます。反転する表示/非表示ボタンの例が必要な場合は、次の1つを使用します。

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);

ただし、課題追跡システムのリクエストは妥当です。

于 2012-12-19T21:44:49.660 に答える