Grails中的JQuery Datepicker,控制器接收null

时间:2014-03-28 16:24:12

标签: grails datepicker

所以,我安装了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>

完成后,最后一个问题是“必需”

3 个答案:

答案 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()
}

将JQuery-ui datepicker添加到Grails脚手架模板

编辑/src/templates/scaffolding/renderEditor.template文件(假设您正在使用scaffold模板)并将renderDateEditor替换为附加了jquery-ui datepicker函数的简单输入字段。

注意:

  1. 域对象日期到字段字符串:g:formatDate元素将域对象日期字段转换为可由datepicker和&#34; grails读取的格式。 databinding.dateFormats&#34;数据绑定定义。它引用了属性&#39; datetime.date.format&#39;,在SimpleDateFormatter语法的messages.properties文件中定义

  2. datepicker到字符串字符串:dateFormat属性告诉datepicker以Data Binding配置可以解析的格式写入日期。语法似乎是datepicker特有的。

  3. timepicker :也可以使用other jquery add ons轻松添加时间。您必须确保时间格式也与数据绑定配置匹配

  4. 示例代码:

    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()
            }
        }
    }
    

    表单字段

    中的数据绑定日期字符串

    要从表单字段中读取日期字符串,您需要执行以下一项或多项操作:

    1. 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; ]

    2. LOCAL :将@BindingFormat(&#39; yyyy / MM / dd&#39;)添加到类定义中的Date属性