I am trying to implement DirtyForms-style validation library using Lift. What I'd like to do is send the event parameter from a click action to some server-side validation logic. I've found many answers to the problem of passing function arguments to Ajax, but none using Lift.
Here is what I have...
The DirtyField class is a class that keeps track of fields that have been 'dirtied'. Its method isDirty(): Boolean
evaluates whether the field value has changed since the page was initialized (this works great).
class DirtyForm(fields: Seq[DirtyField[_]])
{
val popupId = "popup"
private def fieldsDirty(): JsCmd = fields.exists(_.isDirty) match {
case true => Run("""function(e) { e.preventDefault(); $('#""" + popupId + """').dialog(); }""") //prevent them from clicking link if they need to save their data
case false => Noop
}
def seq(): NodeSeq = {
Script(Run("""
$(document).ready(function() {
$(document).on('click', 'a[href]', """ + SHtml.ajaxInvoke(() => fieldsDirty()).toJsCmd + """);
});""".stripMargin)) ++ ConfirmationDiv(popupId) /*div with 'popup' as id*/
}
}
Calling code:
def render = {
//...
val myDirtyForm = new DirtyForm(/*some fields to watch here*/)
"* *+" #> myDirtyForm.seq()
}
Generated javascript:
<script>
// <![CDATA[
$(document).ready(function() {
$(document).on('click', 'a[href]', liftAjax.lift_ajaxHandler("F1336229574104X2J5CL=true", null, null, null));
});
// ]]>
</script>
When this ajax call is invoked on a link click with a dirtied field, I get the following error in the console: The server call succeeded, but the returned Javascript contains an error: SyntaxError: Unexpected token (
, which I expect to be because I am trying to use function()
where it is not applicable.
TL;DR: My problem revolves around two things:
- I want to evaluate whether or not the form is dirty via ajax
- If it is dirty, I want to call preventDefault()
Disclaimer: this is my first post, so any suggestions on how to improve the question would be appreciated!