ClientHandler.validateMatches()メソッドを使用して、UIの一部の要素を非表示/表示および有効化/無効化しようとしています。2つのClientHandlerを追加していますが、実際には1つだけが期待どおりに実行されているようです。コードは次のとおりです。
function doGet(e) {
var app = UiApp.createApplication();
var grid = createAdultInfoGrid(135, 8);
app.add(grid);
return app;
}
/* Element id for adult-specific information grid element */
var GRID_ADULTS_ID = 'G_AdultInfo';
/* Element id for driver status field */
var PARTICIPANT_DRIVER_ID = 'P_IsDriver';
/* Element id for seatbelt count field */
var PARTICIPANT_SEATBELT_COUNT_ID = 'P_BeltCount';
/* Element id for seatbelt count status message field */
var PARTICIPANT_SEATBELT_MSG_ID = 'P_BeltCountMsg';
/**
* Creates a new grid for display of adult-specific information using the GRID_ADULTS_ID constant as its id
* @param pLblWidth - the width to be used for labels
* @param pCellPadding - the value to be used for cell padding in the resulting grid
*/
function createAdultInfoGrid(pLblWidth, pCellPadding) {
Logger.log("Creating adult participant information grid . . .");
var app = UiApp.getActiveApplication();
var grid = app.createGrid(2, 3).setId(GRID_ADULTS_ID).setCellPadding(pCellPadding);
Logger.log("Creating listbox - driver . . .");
var lstBoxDriver = app.createListBox().setId(PARTICIPANT_DRIVER_ID).setName('DriverStatus');
lstBoxDriver.setVisibleItemCount(1);
lstBoxDriver.addItem('Yes');
lstBoxDriver.addItem('No');
lstBoxDriver.setItemSelected(0, true);
Logger.log("Creating textbox - seatbelts . . .");
var txtBoxSeatBelts = app.createTextBox().setId(PARTICIPANT_SEATBELT_COUNT_ID).setValue('2');
var labelBeltStatus = app.createLabel('Please enter a number between 1 and 15.').setId(PARTICIPANT_SEATBELT_MSG_ID).setWidth(pLblWidth * 2).setVisible(false);
var driverYesHandler = app.createClientHandler()
.validateMatches(lstBoxDriver, '([Yy][Ee][Ss]){1}')
.forTargets(txtBoxSeatBelts)
.setText('')
.setEnabled(true)
.setVisible(true)
.setStyleAttribute("color", "black")
.setStyleAttribute("background", "white")
.forTargets(labelBeltStatus)
.setVisible(false);
var driverNoHandler = app.createClientHandler()
.validateMatches(lstBoxDriver, '([Nn][Oo]){1}')
.forTargets(txtBoxSeatBelts)
.setText('0')
.setEnabled(false)
.setVisible(true)
.setStyleAttribute("color", "black")
.setStyleAttribute("background", "white")
.forTargets(labelBeltStatus)
.setVisible(false);
lstBoxDriver.addChangeHandler(driverYesHandler);
lstBoxDriver.addChangeHandler(driverNoHandler);
Logger.log("Adding listbox - driver . . .");
grid.setWidget(0, 0, app.createLabel('I am willing to drive:').setWidth(pLblWidth));
grid.setWidget(0, 1, lstBoxDriver);
Logger.log("Adding textbox - seatbelts . . .");
grid.setWidget(1, 0, app.createLabel('Seatbelts:').setWidth(pLblWidth));
grid.setWidget(1, 1, txtBoxSeatBelts);
grid.setWidget(1, 2, labelBeltStatus);
app.close();
return grid;
}
ブラウザでアクセスすると、リストボックスを「はい」から「いいえ」に変更でき、ClientHandlerが機能します(テキストが0に設定されている、フィールドが無効になっているなど)。ただし、リストボックスが「いいえ」から「はい」に変更されると、期待されるアクションは実行されません。フォームは同じ状態のままになります。'i'フラグを指定して正規表現パターンとして'Yes'と'No'を使用してみましたが、validateNotMatch()メソッドを使用してみましたが、役に立ちませんでした。最初の変更がデフォルト値から行われた後、イベントはキャッチされていないようです。任意の提案をいただければ幸いです。
よろしくお願いします、
dgg