【问题标题】:Loading relevant data into browser for Grails app将相关数据加载到 Grails 应用程序的浏览器中
【发布时间】:2025-12-07 23:30:01
【问题描述】:

我正在为大型数据集构建一个 grails 应用程序,并且由于在我的应用程序的 javascript 端(客户端)加载一个大型 json 文件而面临各种问题,导致浏览器崩溃。

现在,我意识到我只在 javascript 端进行所有用户选择,但我假设它可以在 grails 控制器端完成,也可以使用标签和“参数”

我在看:

http://grails.org/doc/latest/ref/Tags/link.html
http://grails.org/doc/latest/ref/Tags/form.html

但是,我对此很陌生,如果我尝试做的事情是否可行,我需要一些指导吗? 基本上,我希望用户选择一堆下拉列表,它们的值被传递给我的 grails 控制器,控制器将过滤后的数据发送到 javascript 以加载,这样只有相关数据被发送到浏览器并运行正确。

更新

package marchmock2
class Tablev1class {
Date date_hour
String mv
String pagetype
Integer visits
Integer visits_ly
Integer visits_lw
String time_period
String platform
String device
String browser


static mapping = {
table "pgtyp"
version false        
date_hour column: "date_hour"
mv column: "mv"
pagetype column: "pagetype"
visits column: "visits"
visits_ly column:"visits_ly"
visits_lw column:"visits_lw"
time_period column:"time_period"
platform column:"platform"
device column:"device"
browser column:"browser"
}
static constraints = {
}
}

这就是我的域类的样子,并且没有依赖关系。我想要的只是从各种 mv、页面类型、平台、设备、浏览器中创建选择,并将所做的选择传递给要对数据库进行查询的控制器

【问题讨论】:

  • 创建 g:select 列出相同表的元素,将 optionValue 设置为不同的对象,即first selwct optionValue mv 2nd pagetype 依此类推。如果您需要它在用户选择时计算某些内容,请查看 onchange 并对其远程调用到处理所选元素的 xall 控制器

标签: javascript grails gsp


【解决方案1】:

我认为您可能需要在最后一部分中编辑问题并重新定义您的要求。

你可以看看这里:

I want my selects dropdowns to auto populate with Ajax in Grails website

在这个问题上,我有点打破了您如何使用远程调用从一个字段收集数据以生成下一个选择?这是需求的一部分,还是这些都是相互不依赖的单一选择?

如果与依赖相关的选择,则使用 ajaxdependancyselection 插件,可以实现适当的嵌套选择。如果选择来自大型数据集,那么对主要问题的建议可能会更快.....

更新 由于它们是独立的,您可以加载

<g:select name="input1" from="${domainClass1.list()}" ...>

对于每个 domainClass 调用 将其发布回您的控制器

在你的控制器中

def d1=domainClass1.get(params.input1)
def d2=domainClass2.get(params.input2)

render (view: 'something', model: [ d1: d1, d2:d2 ] )

等等 然后您可以扩展每个传递的 domainClass 对象,并从每个 d1 d2 等中获取特定的相关元素......

我真的不确定是否客观,如果不是您想要的,请道歉

更新更新

不确定为什么您需要对每个对象进行选择,也许正如您所说,您想对这些值做一些事情.. 在这种情况下,请看最后一个示例,optionKey 和 optionValue 都设置为设备,因此它将在选择中显示设备,而用户选择最终将成为实际的设备选择

<g:select id="mv" name="mvid" from="${marchmock2.Tablev1class.list()}" optionKey="id"   optionKey="mv" required="" value="${params?.mvid}" class="many-to-one"/>
<g:select id="mv" name="mvid" from="${marchmock2.Tablev1class.list()}" optionKey="id"   optionKey="pagetype" required="" value="${params?.mvid}" class="many-to-one"/>

<g:select id="mv" name="mvid" from="${marchmock2.Tablev1class.list()}" optionKey="id"   optionKey="platform" required="" value="${params?.mvid}" class="many-to-one"/>

<g:select id="mv" name="mvid" from="${marchmock2.Tablev1class.list()}" optionKey="device"   optionKey="device" required="" value="${params?.mvid}" class="many-to-one"/>

现在展开这个

<g:select id="mv" name="mvid" from="${marchmock2.Tablev1class.list()}" optionKey="device"   optionKey="device" required="" value="${params?.mvid}" class="many-to-one" onchange="${remoteFunction (
        controller: 'someController',
        action: 'someAction',
        params: "'device=' + this.value",
        update: 'newDivId'
    )}"/>

<div id="newDivId">
<!-- your output from when user selects something from above will end up showing the result from the someController/someAction?device={selected} will be repesented in here -->
</div>

【讨论】:

  • 我的应用程序中不需要依赖相关的选择。所有下拉菜单都是独立的
  • 我的应用程序中不需要依赖相关的选择。所有下拉菜单都是独立的。此外,我们有庞大的数据集,因此在浏览器中过滤这些数据集并不是一个好主意。因此,我想以某种方式在控制器内部过滤数据(在 GSP 中选择的维度上),然后将其发送到浏览器,以便减少浏览器的负载。另外,作为Grails的新手,我什至不知道这是否真的可行。如果您有任何建议,请告诉我。这将有很大帮助
  • 哦等等..我有一个包含许多字段的域类(或其他任何名称)。我提到的这些下拉列表是我的域类中的各个字段中的几个。我很抱歉,如果我很愚蠢,但是,这就是你所说的依赖选择吗??
  • 另外,为什么我提到我的选择不是相互依赖的,因为无论在第一个选择中选择什么,其他选择每次都需要具有所有值。因此,我称他们不依赖。
  • 我仍然很困惑,您能否发布一个示例 domainClass 示例,如果您可以说具有 MULTIPLE hasMany 关系的主域类,因此一个 Country hasMany Cities 和 Citizens。您是说您希望选定的国家然后将相关城市和公民一起显示?如果是这样,这在 ajaxdependancyselection 中受支持,您只需声明 domain2 domain3 domain4 等,请进一步检查示例以进行多域选择。或者您是否希望为一个 domainClass 中的不同字段创建选择字段 - 每次由 optionKey optionValue 设置...您只需声明字段名
最近更新 更多