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

ここでのAlexanderTokarevの回答に同意しますが、サーバーからビュークラスを返す必要がある場合は、それらを馬鹿にすることをお勧めします。構成のみ。すべての機能とリスナーをクライアント側のコントローラーに移動します。

于 2013-01-09T01:03:46.160 に答える
1

json.orgをよく見ると、JSON がデータ交換形式であり、JSON で許可されている型にFunction関数宣言が含まれていないことがわかります。がある場合function、それはもはや JSON ではなく、JavaScript です。関数を渡すことができるJSONコンバーターはありません(そうするためにハッキングしない場合)

関数をコントローラーに送信する場合は、呼び出す関数の名前とパラメーターを渡さないでください。これは、別の JavaScript ファイルで定義されます。

于 2013-01-09T00:09:25.957 に答える