0

我想让一个控制器发出一个 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 具有 function() 的字符串:

{
    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 格式返回的真正“对象数据”,如果这不可能,我可以理解。

4

2 回答 2

1

如果您仔细查看json.org,您会发现 JSON 是一种数据交换格式,并且 JSON 中允许的类型不包括Function函数声明。如果有一个function,那不再是 JSON,那是 javascript。你永远不会有一个允许在其中传递函数的 JSON 转换器(如果你不破解它来这样做)

如果您想将函数传输到控制器,为什么不传递要调用的函数的名称和参数,它们将在单独的 javascript 文件中定义。

于 2013-01-09T00:09:25.957 回答
1

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

于 2013-01-09T01:03:46.160 回答