所以,我安装了http://grails.org/plugin/jquery-ui,使用JQuery Datepicker而不是默认的Grails datepicker。
问题是,当控制器收到值时,它给出null,我不知道如何获取值。
案例1.我在gsp中拥有的内容:
<input type="text" id="fechaEstimadaInicio" name="fechaInicio" value="${pasantiaCortaInstance?.fechaInicio}">
“fechaEstimadaInicio”是我的JQuery Datepicker。
案例2.在JQuery Datepicker之前,我有这个:
<g:datePicker relativeYears="[-7..7]" id="fechaEstimadaInicio" name="fechaInicio" precision="day" value="${pasantiaCortaInstance?.fechaInicio}" />
在我的控制器中我尝试了这个:
@Transactional
def save(PasantiaCorta pasantiaCortaInstance) {
println pasantiaCortaInstance.fechaInicio
}
在案例1中,它给出了: 3月28日星期五00:00:00 VET 2014
案例2:null
非常感谢您提前
修改
阿达维斯你的意思是这样的吗?
在taglib实验之前,我的JQuery Datepicker看起来像这样:
<g:field type="text" id="fechaDeAprobada" name="fechaDeAprobada" value="${pasantiaCortaInstance?.fechaAprobada}"></g:field>
在JSScript中:
...
$("#fechaDeAprobada").datepicker({
dateFormat : 'yy/mm/dd'
});
...
我创建了TagLib,现在取代了我有的g:字段
<g:jqDatePicker id="fechaDeAprobada" name="fechaDeAprobada" />
但它仍然像文本一样打印taglib 我没有改变头脑中的任何东西
EDIT2:
是的,它正在使用一个新的example.gsp;但是如果我尝试在静态脚手架中使用它,那么_form.gsp和create.gsp它就不起作用。
这是create.gsp
中的表单<g:form url="[resource:pasantiaCortaInstance, action:'save']" >
<fieldset class="form">
<g:render template="form"/>
</fieldset>
<fieldset class="buttons">
<g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
</fieldset>
<g:jqDatePicker id="fechaEstimadaInicio" name="fechaInicio" class="datepicker" value="" />
</g:form>
在_form.gsp中:
<div
class="fieldcontain ${hasErrors(bean: pasantiaCortaInstance, field: 'fechaInicio', 'error')} required">
<label for="fechaInicio"> <g:message
code="pasantiaCorta.fechaInicio.label" default="Fecha Inicio" /> <span
class="required-indicator">*</span>
</label>
<g:jqDatePicker id="fechaEstimadaInicio" name="fechaInicio" class="datepicker" value="" />
</div>
完成后,最后一个问题是“必需”
答案 0 :(得分:3)
我在我的项目中使用了自定义标记库,这是从其他版本在线修改的,但它支持包含&#34; dot&#34; 的日期名称,如&#34; myClass.fieldName&#34; 。另一个版本没有。
<g:jqDatePicker name="fechaInicio" class="datepicker" value="" />
class jqueryDatePickerTagLib {
def jqDatePicker = {attrs, body ->
def out = out
def name = attrs.name //The name attribute is required for the tag to work seamlessly with grails
def id = attrs.id ?: name
def minDate = attrs.minDate
def showDay = attrs.showDay
def val = attrs.value ?: ''
//Create date text field and supporting hidden text fields need by grails
out.println "<input type=\"text\" name=\"${name}\" id=\"${id}\" value=\"${val}\" class=\"datepicker input-small\"/>"
out.println "<input type=\"hidden\" name=\"${name}_day\" id=\"${id}_day\" />"
out.println "<input type=\"hidden\" name=\"${name}_month\" id=\"${id}_month\" />"
out.println "<input type=\"hidden\" name=\"${name}_year\" id=\"${id}_year\" />"
//Code to parse selected date into hidden fields required by grails
out.println "<script type=\"text/javascript\"> \$(document).ready(function(){"
out.println "\$(\"input[name='${name}']\").datepicker({"
out.println "onClose: function(dateText, inst) {"
out.println "\$(\"input[name='${name}']\").attr(\"value\",dateText);"
out.println "\$(\"input[name='${name}_month']\").attr(\"value\",new Date(dateText).getMonth() +1);"
out.println "\$(\"input[name='${name}_day']\").attr(\"value\",new Date(dateText).getDate());"
out.println "\$(\"input[name='${name}_year']\").attr(\"value\",new Date(dateText).getFullYear());"
out.println "}"
//If you want to customize using the jQuery UI events add an if block an attribute as follows
if(minDate != null){
out.println ","
out.println "minDate: ${minDate}"
}
if(showDay != null){
out.println ","
out.println "beforeShowDay: function(date){"
out.println "var day = date.getDay();"
out.println "return [day == ${showDay},\"\"];"
out.println "}"
}
out.println "});"
if (val != '') {
out.println("\n")
out.println "\$(\"input[name='${name}_month']\").attr(\"value\",new Date('${val}').getMonth() +1);"
out.println "\$(\"input[name='${name}_day']\").attr(\"value\",new Date('${val}').getDate());"
out.println "\$(\"input[name='${name}_year']\").attr(\"value\",new Date('${val}').getFullYear());"
}
out.println "})</script>"
}
}
答案 1 :(得分:3)
我发现自定义TagLib是最佳解决方案。我在网上找到了这个,它就像一个梦想。我做了一些细微的更改,因为它为我的用途返回了许多不必要的数据。这实际上只是将日期作为mm / dd / yy返回给控制器。
class JQDatepickerTagLib {
def jqDatePicker = { attrs, body ->
def out = out
def name = attrs.name //The name attribute is required for the tag to work seamlessly with grails
def id = attrs.id ?: name
def value = attrs.value
def displayFormat = attrs.displayFormat
def datepickerFormat = attrs.datepickerFormat
def displayFormatString = displayFormat ? displayFormat : "MM/dd/yyyy"
def datepickerFormatString = datepickerFormat ? datepickerFormat : "mm/dd/yy"
def dateString = value ? value.format(displayFormatString) : ""
//Create date text field and supporting hidden text fields need by grails
out.println "<input type=\"text\" name=\"${name}\" id=\"${id}\" value=\"${dateString}\" />"
//Code to parse selected date into hidden fields required by grails
out.println "<script type=\"text/javascript\"> \$(document).ready(function(){"
out.println "\$(\"#${name}\").datepicker({"
out.println "onClose: function(dateText, inst) {"
out.println "if(dateText){"
out.println "var selDate = \$.datepicker.parseDate('${datepickerFormatString}', dateText);"
out.println "}"
out.println "}"
out.println "});"
out.println "})</script>"
}
}
然后只需在您的GSP中添加:
<g:jqDatePicker name="date"></g:jqDatePicker>
和BOOM !!你有一个花哨的日期选择器,将通过任何actionSubmit发送回你的控制器。更改标记lib中日期的格式。快乐的编码:)
答案 2 :(得分:1)
这是#34; grails datepicker&#34;的首批结果之一。我试着遵循这里的一些建议并且无法让它们工作。经过相当多的搜索后,我发现使Date对象工作相对容易。这假设正确安装了jquery和jquery-ui插件。我也遇到了这些麻烦,最后采取了以下步骤来安装jquery-ui(可能有更优雅的方式)。
public DomainObjectWithDate {
Date currentDateTime = new Date()
Date currentDate = new Date()
}
编辑/src/templates/scaffolding/renderEditor.template文件(假设您正在使用scaffold模板)并将renderDateEditor替换为附加了jquery-ui datepicker函数的简单输入字段。
注意:
域对象日期到字段字符串:g:formatDate元素将域对象日期字段转换为可由datepicker和&#34; grails读取的格式。 databinding.dateFormats&#34;数据绑定定义。它引用了属性&#39; datetime.date.format&#39;,在SimpleDateFormatter语法的messages.properties文件中定义
datepicker到字符串字符串:dateFormat属性告诉datepicker以Data Binding配置可以解析的格式写入日期。语法似乎是datepicker特有的。
timepicker :也可以使用other jquery add ons轻松添加时间。您必须确保时间格式也与数据绑定配置匹配
示例代码:
private renderDateEditor(domainClass, property) {
def precision = (property.type == Date || property.type == java.sql.Date || property.type == Calendar) ? "day" : "minute";
if (!cp) {
return "<g:datePicker name=\"${property.name}\" precision=\"${precision}\" value=\"\${${domainInstance}?.${property.name}}\" />"
} else {
if (!cp.editable) {
return "\${${domainInstance}?.${property.name}?.toString()}"
} else {
def out = new StringBuffer("")
out << "<input type=\"text\" name=\"${property.name}\" id=\"${property.name}\" value=\"<g:formatDate date=\"\${${domainInstance}?.${property.name}}\" formatName=\"datetime.date.format\" />\"/>"
out << """<g:javascript>
\$(function() {
\$( "#${property.name}" ).datepicker(
{
dateFormat:'yy/mm/dd',
});
})
</g:javascript>"""
return out.toString()
}
}
}
要从表单字段中读取日期字符串,您需要执行以下一项或多项操作:
GLOBAL :将此属性添加到grails-app / conf / Config.properties。根据需要将其更改为使用您自己的date formats。在Date Formats For Data Binding下了解更多信息。
grails.databinding.dateFormats = [ &#39; YYYY / MM / DD&#39 ;, &#39; yyyy / MM / dd HH:mm&#39; ]
LOCAL :将@BindingFormat(&#39; yyyy / MM / dd&#39;)添加到类定义中的Date属性