我可以使用grails以某种方式使用匿名javascript函数发出数据

时间:2013-01-08 23:23:48

标签: grails extjs

我想让控制器发出JSON响应,如下所示:

{
    sidebar: {
        xtype: "container",
        flex: 1,
        bodyCls: "my-sidebar",
        itemId: "my-sidebar-container",
        items: [
        {
            xtype: "panel",
            animCollapse: false,
            collapseFirst: false,
            collapsed: false,
            collapsible: true,
            flex: 1,
            bodyCls: "my-sidebar-message-section",
            itemId: "my-sidebar-message-section-container",
            html: "<h1>Messages (2)</h1><p>Bank will be closed on September 4th, 2013 for Labor Day</p><p>Lorem ipsum dolor sit amet, <a href="http://google.com">consectetur</a> adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>",
            listeners: {
                 boxready: function(p) {
                      alert('Hi');
                 }
            }
        }
        ]
    }
}

在我的Grails控制器中,我这样定义:

package com.fourgablesguy.myapp

import grails.converters.JSON

class SidebarController {

def generateSideBar() {
    def sidebarItems = [
            [
                xtype: 'panel',
                animCollapse: false,
                collapseFirst: false,
                collapsed: false,
                collapsible: true,
                flex: 1,
                bodyCls: 'my-sidebar-message-section',
                itemId: 'my-sidebar-message-section-container',
                html: messageSectionHtml,
                listeners: [
                    boxready: "function(p) { alert('Hi');}"
                ]
            ]
        ]
    [
     xtype: 'container',
     flex: 1,
     bodyCls: 'my-sidebar',
     itemId: 'my-sidebar-container',
     items: sidebarItems
    ]
}

然而,grails.converters.JSON将我的function()定义转换为字符串,因此控制器动作发出的实际JSON具有函数()的字符串:

{
    sidebar: {
        xtype: "container",
        flex: 1,
        bodyCls: "my-sidebar",
        itemId: "my-sidebar-container",
        items: [
        {
            xtype: "panel",
            animCollapse: false,
            collapseFirst: false,
            collapsed: false,
            collapsible: true,
            flex: 1,
            bodyCls: "my-sidebar-message-section",
            itemId: "my-sidebar-message-section-container",
            html: "<h1>Messages (2)</h1><p>Bank will be closed on September 4th, 2013 for Labor Day</p><p>Lorem ipsum dolor sit amet, <a href="http://google.com">consectetur</a> adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>",
            listeners: {
                 boxready: "function(p) {alert('Hi');}"
                 }
            }
        }
        ]
    }
}

具体问题是这一行: boxready:“function(p){alert('Hi');}” 我想知道一种方法来代替上面的: boxready:function(p){alert('Hi');}

这不是真正的“对象数据”我试图用JSON返回,我可以理解这是不可能的。

2 个答案:

答案 0 :(得分:1)

如果仔细查看json.org,您会看到JSON是一种数据交换格式,JSON中允许的类型不包括Function或函数声明。如果有function,那就不再是JSON,那就是javascript。你将永远不会有一个允许传递函数的JSON转换器(如果你没有这样做的话)

如果要将功能传送到控制器,为什么不传递要调用的函数的名称和参数,这将在单独的javascript文件中定义。

答案 1 :(得分:1)

同意Alexander Tokarev在这里的回答,但是我想建议如果你绝对需要从服务器返回视图类,那么就让它们变得愚蠢。仅限配置。将所有功能和侦听器移动到客户端控制器。