【问题标题】:Grails - how to bind data to a map in a command object?Grails - 如何将数据绑定到命令对象中的地图?
【发布时间】:2021-01-07 16:15:50
【问题描述】:

我有一个表,其中每一行都有一个切换开关来暂停/恢复计划任务(我正在使用 Quartz 调度程序来执行此操作)。显示此表的屏幕每 10 秒刷新一次。当前发生的情况是,每次刷新时都不会“记住”按钮的选定切换。

例如,如果我使用切换开关将暂停任务单击为“打开”,当屏幕刷新时,切换开关将设置回“关闭”,因为切换选择未被记住。

我当前的实现有一个在切换选择更改时触发的函数。这需要三个参数 - 名称/组(用于石英功能)和值(用于获取检查值的表行中的切换开关的 ID)。基本上在这个函数中,我将 id 映射到切换开关的布尔检查值:

function pause(name, group, value)
{
    var checked = $('#pauseScheduledTask' + value).prop('checked');
    var map = {}
    map[value] = checked
    var data = {
        taskName: name,
        taskGroup: group,
        idToCheckedValue: map,
    };

    var url = '<g:createLink controller="scheduler" action="pauseScheduledTask"/>';
    ajaxUpdateAction(url, data, null, null, null, null);
}

控制器:

    def pauseScheduledTask(PauseTaskCmd cmd)
    {
        // Logic to do here...
    }

我的控制器方法采用这个命令对象:

class PauseTaskCmd implements Validateable {

String taskName
String taskGroup
Map<String, Boolean> idToCheckedValue = new HashMap<>();

static constraints = {
    taskName nullable: false
    taskGroup nullable: false
 }

}

命令对象中的字符串值绑定正常,但我的控制器中的映射始终为空。绑定到地图是一种特殊情况吗?如何将我的函数中的地图绑定到命令对象中的地图?如果我可以在我的命令对象中获取映射,那么我应该能够在屏幕刷新时使用它们来显示值。

Row toggle switch in table

【问题讨论】:

  • 你能显示生成的正在发布的 JSON 吗?

标签: grails


【解决方案1】:

https://github.com/jeffbrown/johncommandobjectmap查看项目。

https://github.com/jeffbrown/johncommandobjectmap/blob/775914e60768993f79f151cfe12d99f4944dd0a3/src/main/groovy/demo/PauseTaskCmd.groovy

package demo

import grails.validation.Validateable

class PauseTaskCmd implements Validateable {

    String taskName
    String taskGroup
    Map<String, Boolean> idToCheckedValue = new HashMap<>();

    static constraints = {
        taskName nullable: false
        taskGroup nullable: false
    }
}

https://github.com/jeffbrown/johncommandobjectmap/blob/775914e60768993f79f151cfe12d99f4944dd0a3/grails-app/controllers/johncommandobjectmap/DemoController.groovy

package johncommandobjectmap

import demo.PauseTaskCmd

class DemoController {

    def pauseScheduledTask(PauseTaskCmd cmd) {
        render "cmd.idToCheckedValue -> ${cmd.idToCheckedValue}"
    }
}

如果您要发布这样结构的 json,那应该可以:

{"idToCheckedValue":{"first key":"first value", "second key":"second value"}}
$ curl -H "Content-Type: application/json" -X POST -d '{"idToCheckedValue":{"first key":"first value", "second key":"second value"}}' http://localhost:8080/demo/pauseScheduledTask

cmd.idToCheckedValue -> [first key:first value, second key:second value]

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多