我想让控制器发出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返回,我可以理解这是不可能的。
答案 0 :(得分:1)
如果仔细查看json.org,您会看到JSON是一种数据交换格式,JSON中允许的类型不包括Function
或函数声明。如果有function
,那就不再是JSON,那就是javascript。你将永远不会有一个允许传递函数的JSON转换器(如果你没有这样做的话)
如果要将功能传送到控制器,为什么不传递要调用的函数的名称和参数,这将在单独的javascript文件中定义。
答案 1 :(得分:1)
同意Alexander Tokarev在这里的回答,但是我想建议如果你绝对需要从服务器返回视图类,那么就让它们变得愚蠢。仅限配置。将所有功能和侦听器移动到客户端控制器。