Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用grails以某种方式通过匿名javascript函数发出数据吗_Grails_Extjs - Fatal编程技术网

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

我可以使用grails以某种方式通过匿名javascript函数发出数据吗,grails,extjs,Grails,Extjs,我希望控制器发出JSON响应,如下所示: { sidebar: { xtype: "container", flex: 1, bodyCls: "my-sidebar", itemId: "my-sidebar-container", items: [ { xtype: "panel", animCollapse: false,

我希望控制器发出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');
                 }
            }
        }
        ]
    }
}
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.converts.JSON将my function()定义转换为字符串,因此控制器操作发出的实际JSON具有函数()的字符串:

{
侧栏:{
xtype:“容器”,
弹性:1,
bodyCls:“我的侧边栏”,
itemId:“我的边栏容器”,
项目:[
{
xtype:“面板”,
答案:错,
collapseFirst:false,
错误:,
可折叠的:是的,
弹性:1,
bodyCls:“我的侧边栏消息部分”,
itemId:“我的边栏消息节容器”,
html:“信息(2)银行将于2013年9月4日劳动节关闭

Lorem ipsum door sit amet,adipising elit,sed do eiusmod temporal incidedut ut laboure and dolore magna aliqua.ut enim ad minim veniam,quis nostrud execution ullamco laboris nisi ut aliquip ex ea commodo consequat.

”, 听众:{ boxready:“函数(p){alert('Hi');}” } } } ] } }
具体问题如下: boxready:“函数(p){alert('Hi');}” 我想知道返回上述内容的方法,如下所示: boxready:function(p){alert('Hi');}


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

如果仔细观察,您会发现JSON是一种数据交换格式,JSON中允许的类型不包括
函数或函数声明。如果有一个
函数
,那就不再是JSON,而是javascript。你将永远不会有一个JSON转换器,它将允许在其中传递函数(如果你不破解它的话)


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

同意Alexander Tokarev的回答,但我想建议,如果绝对需要从服务器返回视图类,请将它们设置为哑巴。仅配置。将所有功能和侦听器移动到客户端控制器

由于安全原因,JSON不允许使用函数。感谢您的帮助,为了解决这个问题,我将遵循@dbrin建议,并将侦听器功能移动到控制器上Ext.define('SB.controller.Home',{'extend:'Ext.app.controller',init:function(application){Ext.ns('SB.Home.utils');SB.Home.utils.moveHeaderTools=function(p){alert('Hi');};this.control({'my sidebar message section container':{boxready:SB.home.utils.moveHeaderTools}});}`我建议不要这样做;对于像上面这样的简单函数,它可能看起来很诱人,但对于任何稍微复杂一点的函数,它很快就会变成维护噩梦。您试图解决的原始问题是什么?@Alexander在Grooveek的回答中看到我的评论
{
    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');}"
                 }
            }
        }
        ]
    }
}