0

我使用的是 grails 中的常规 datePicker,但我认为使用带有日历的 textField 更容易,因此建议我使用 Grails-UI。

我的问题是,现在,当我单击应用过滤器时,它们不起作用。不知何故,他们没有被认可。

任何帮助将不胜感激。

这是控制器的代码:

def searchResults = {
  def fromCal
  if(params?.lastUpdatedD) {
fromCal = Calendar.getInstance()
fromCal.setTime(params?.lastUpdatedD)
fromCal.set(Calendar.HOUR_OF_DAY,0)
fromCal.set(Calendar.MINUTE,0)
fromCal.set(Calendar.SECOND,0)
fromCal.set(Calendar.MILLISECOND,0)
}

 def toCal
if(params?.lastUpdatedH) {
toCal = Calendar.getInstance()
toCal.setTime(params?.lastUpdatedH)
toCal.set(Calendar.HOUR_OF_DAY,23)
toCal.set(Calendar.MINUTE,59)
toCal.set(Calendar.SECOND,59)
toCal.set(Calendar.MILLISECOND,999)
}

def entryCriteria = Entry.createCriteria() 
def results = entryCriteria.list {
and{if(params?.fechaCambioD && params?.fechaCambioH) { 
between("fechaCambio", params.fechaCambioD, params.fechaCambioH) 
} 

if(params?.lastUpdatedD && params?.lastUpdatedH) { 
between("lastUpdated", fromCal.getTime(), toCal.getTime()) 
}

if(params?.proyectoRutaN) { 
ilike("proyectoRuta","%${params.proyectoRutaN}%")
}    
 }

 }

render(view:'searchResults', model:['results':results, 'proyectoRutaN':params?.proyectoRutaN, 'fechaCambioD':params?.fechaCambioD, 'fechaCambioH':params?.fechaCambioH, 'lastUpdatedD':'', 'lastUpdatedH':params?.lastUpdatedH]) 

这是 search.gsp 中的一段代码,其中声明了 gui:datePicker

<gui:datePicker name="fechaCambioH" value="${params?.fechaCambioH}" formatString="dd/MMM/yyyy"/>

如果我将它们更改为<<gui:datePicker name="fechaCambioH" value="${params?.fechaCambioH}" precision="day" default="none" noSelection="['':'']" years="${2010..2015}"/>/>它工作得很好,但它为我提供了 3 个下拉框,用于表示日月和年,并且我的想法是只使用一个带有日历的文本字段,以帮助它看起来更好。

提前致谢

更新

这是我在 list.gsp 中的代码

def list = {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    [entryInstanceList: Entry.list(params), entryInstanceTotal: Entry.count()]
    def today = Calendar.getInstance()
    today.setTime(new Date())
    today.set(Calendar.HOUR_OF_DAY, 0)
    today.set(Calendar.MINUTE, 0)
    today.set(Calendar.SECOND, 0)
    today.set(Calendar.MILLISECOND, 0)
    def results = Entry.findAllByFechaCambioGreaterThanEquals(today.getTime()) 
    render(view:'list', model:['entryInstanceList':results])

所以我想知道是否可以对过滤后的内容进行相同的排序。因为现在当我单击每列的标题时,在被过滤后,它会从列表中订购每一项。如果我在每次创建新条目时都这样做,它会从今天开始对它们进行排序(仅对您所看到的内容进行排序),但是当我应用过滤器然后对其排序时,它会对列表中的每个项目进行排序,而不仅仅是显示的内容.

我觉得这听起来有点混乱,我希望你能帮助。

提前致谢!

4

1 回答 1

1

会将日期的字符串值传递给您的控制器。您需要将发送到控制器的字符串解析为 Date 对象。查看 Date 类 ( http://groovy.codehaus.org/groovy-jdk/java/util/Date.html ) 和 SimpleDateFormat 类 ( http://download.oracle.com/docs的 parse() 方法/cd/E17476_01/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html )。使用 SimpleDateFormat 中的文档为您的日期创建格式字符串,然后使用 Date 类将字符串解析为日期。例如...

def dateFmt = "dd/MMM/yyyy"
def fechaCambioDateH 
def toCal
if(params?.fechaCambioH) {
   fechaCambioDateH = Date.parse(dateFmt, params?.fechaCambioH)
   toCal = Calendar.getInstance()
   toCal.setTime(fechaCambioDateH)
   // You may not need these anymore:
   toCal.set(Calendar.HOUR_OF_DAY,23)
   toCal.set(Calendar.MINUTE,59)
   toCal.set(Calendar.SECOND,59)
   toCal.set(Calendar.MILLISECOND,999)
}

更新:

对不起,不适合评论:

让我解释一下导致这种行为的原因,您也许可以自己解决这个问题;您似乎开始掌握 Grails 的窍门。当您提交过滤器表单时,您将提交所有表单数据 - 日期范围、proyectoRuta 等。希望您已经知道这是一个 POST 操作,浏览器负责将所有数据发送到您的服务器,Grails 负责将其打包成一个方便的 params 对象,您可以访问该对象。但是,当您单击排序链接时,这是一个 GET 操作。浏览器只是将 url 发送到您的后端。基本上,它符合您的条件搜索,但您要检查的所有参数都是空的。所以基本上你得到了整个域对象列表。在这一点上,你的工作变得更加复杂,因为你 刚刚发现自己,我们都曾在某一时刻发现自己:您需要在 Web 应用程序中管理状态。最简单的方法是将数据存储在用户的会话中。这引入了一些复杂性,因为您的搜索逻辑分布在几个操作上(默认与过滤),因此更加复杂。您基本上可以将搜索结果存储在会话中并使用比较器对其进行排序,或者您可以将搜索条件存储在会话中并在有人单击排序链接时应用不同的排序/顺序。已经让您的搜索逻辑分布在几个操作上(默认与过滤)。您基本上可以将搜索结果存储在会话中并使用比较器对其进行排序,或者您可以将搜索条件存储在会话中并在有人单击排序链接时应用不同的排序/顺序。已经让您的搜索逻辑分布在几个操作上(默认与过滤)。您基本上可以将搜索结果存储在会话中并使用比较器对其进行排序,或者您可以将搜索条件存储在会话中并在有人单击排序链接时应用不同的排序/顺序。

于 2010-07-08T17:20:46.530 回答