表单上通过代码直接给字段赋值，流程提交后没有保存?
李小翔
2014-06-11 19:11

内容列表

如下面直接给表单字段赋值的示例（或者是通过 js 代码直接修改 foobar 的值）：
<g:textField name=”foobar” value=”${ bean.foobar ?: 123} ” />
此时，如果表单加载完后，用户不再手动修改其他表单字段，直接点击流程提交按钮，则流程提交出去后发现 foobar 的值还是空，而不是表单上初始化并显示的123。
原因是流程表单提交的时候，会检查表单是否有变化，如果没有变化则直接提交流程，否则先执行保存操作。而判断表单是否变化，是通过用户操作表单字段后、自动给对应的HTML元素设置一个 changed 的 css 类来实现的。
而上面的例子中，虽然修改了表单字段的值，但是没有触发HTML元素的 onchange 事件、没有设置 changed 的 css 类，因而流程提交时也就认为表单没有变化，从而不会执行保存操作、数据库中 foobar 属性的值也就始终为空了。
因此，解决方案就是给这个字段加一个 css 类，如：
<g:textField name=”foobar” value=”${ bean.foobar ?: 123} ” class=”changed” />
但是，加上 changed 类后，流程保存、提交的时候，浏览器会提示“是否离开该页面...”云云。因此正确的代码应该是：
<g:textField name=”foobar” value=”${ bean.foobar ?: 123} ” class=”${ bean.foobar != 123 ? ‘changed’ : ‘’} ” />
即值改变了的时候才设置 changed 类。