Les Opérateurs booléens et ClientHandler
Est-il possible d'utiliser clienthandlers pour déterminer si les 2 zones de texte sont soit tous les deux vides ou contiennent tous les deux une valeur, mais pas l'un ou l'autre?
Pour le moment je suis en utilisant un serverhandler pour tester cette condition, mais pour la vitesse, je préfère utiliser clienthandlers.
if ((textbox1 == '' && textbox2 == '') || (textbox1 != '' && textbox2 != ''))
//do something
else
//display error 'both boxes must either be empty or contain a value
Cheers
Dave
Un exemple de code:
function genObsReport() {
var myapp = UiApp.createApplication().setTitle('Report');
var dateFrom = myapp.createDateBox().setId("dateFrom");
var dateTo = myapp.createDateBox().setId("dateTo");
var mygrid = myapp.createGrid(2, 2);
mygrid.setWidget(0, 0, myapp.createLabel('Date from'));
mygrid.setWidget(0, 1, dateFrom);
mygrid.setWidget(1, 0, myapp.createLabel('Date to'));
mygrid.setWidget(1, 1, dateTo);
var errors = myapp.createLabel('Error').setId('errors').setVisible(false);
var mybutton = myapp.createButton('Create Report');
var mypanel = myapp.createVerticalPanel();
mypanel.add(mygrid);
mypanel.add(mybutton);
mypanel.add(errors);
myapp.add(mypanel);
var handler = myapp.createServerHandler("change");
handler.addCallbackElement(mygrid);
mybutton.addClickHandler(handler);
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
spreadsheet.show(myapp);
}
function change(eventInfo) {
var app = UiApp.getActiveApplication();
var dateFrom = eventInfo.parameter.dateFrom;
var dateTo = eventInfo.parameter.dateTo;
//check the dates
if ((dateFrom == '' && dateTo == '') || (dateFrom != '' && dateTo != '')) {
//do something
} else {
//show errors
app.getElementById('errors').setVisible(true);
app.getElementById('dateFrom').setStyleAttributes({background: "red", color: "black"});
app.getElementById('dateTo').setStyleAttributes({background: "red", color: "black"});
}
}
- Dans votre idée de ce que serait la source de déclenchement de la client gestionnaire d'? Il ne peut pas être le bouton, ni les zones de date depuis quand vous cliquez sur une case de date, il obtient automatiquement une valeur... donc je ne vois pas comment la mettre en œuvre dans votre code, même si c'était possible ( ce dont je doute...)
- un
addValueChangeHandler()
peut être ajouté à la date de boîtes de déclencher une fonction de serveur pour exécuter la validation tôt, mais le problème avec les zones de date, c'est que une fois que vous jetez une valeur dans l'une puis l'effacer, la valeur reste. - Merci Serge et Bryan. Je vois que vous êtes tous les deux en train de dire. Je vais rester avec ma solution actuelle. Des acclamations.
Vous devez vous connecter pour publier un commentaire.
Oui c'est possible bien que ce que j'ai trouvé est certainement cludgy.
Voici ma logique:
Donné une texbox, ajouter deux clienthandlers qui vérifie la longueur - on vérifie pour 0 longueur des autres pour 1 ou plus. Modifiez la valeur dans une zone de texte caché à 0 ou en fonction de ce qui se passe.
Répétez cette opération avec un autre caché zone de texte pour la deuxième zone de texte.
créer deux nouveaux valideurs pour activer ou désactiver votre bouton à partir de la somme des deux zones de texte caché.
Bien que cela devrait fonctionner étant donné que la documentation dit que les gestionnaires sont faites dans l'ordre de leur ajout, pour plus de sécurité,j'ai ajouté un autre gestionnaire sur le bouton lui-même. J'ai jeté vers le haut le beau code ICI qui y ajoute des étiquettes supplémentaires et de mise en forme pour le rendre plus évident, mais le code est un peu long pour ici donc, ci-dessous à peu près le minimum de ce que vous avez besoin.
Voici le produit final en action
J'ai raté le dateBox - alors, voici le code qui fonctionne pour dateboxes. Quelques notes
pour une raison quelconque. j'ai utilisé une expression régulière de tests pour le caractère' -'. vous devrez peut-être modifier cette valeur si vous avez formaté votre date différemment.
les champs vides
au lieu de cela, comme il a été souligné à juste titre qu'il n'a pas onkeyup
Ci-dessous est le code de cette