0

ajaxリクエストがあるときにレイアウトを変更したい。だから私はそのためのフィルターを設定します:

class AjaxFilters {

def filters = {
    ajaxify(controller: '*', action: '*') {
        after = { Map model ->


    if(model==null) {
        model = new HashMap()
    }

    // only intercept AJAX requests
    if (!request.xhr) {
        model.put("layout", "mainUsers")
        return true 
    }

    // find our controller to see if the action is ajaxified
    def artefact = grailsApplication
        .getArtefactByLogicalPropertyName("Controller", controllerName)
    if (!artefact) { return true }

    // check if our action is ajaxified
    def isAjaxified = artefact.clazz.declaredFields.find {
        it.name == 'ajaxify'
    } != null


    def ajaxified = isAjaxified ? artefact.clazz?.ajaxify : []
    if (actionName in ajaxified || '*' in ajaxified) {
        model.put("layout", "ajax")
        return false
    }
    return true
        }
    }
}
}

これにより、使用するレイアウトを定義する「layout」という名前のビューモデルが作成されます。

レイアウトモデルを使用するビューの例を次に示します。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<meta name="layout" content="${layout}"/>
<title>Profile</title>
</head>
<body>
<h3>Edit Profile</h3>
</body>
</html>

これはコントローラーです:

class SettingsController {
def springSecurityService
static ajaxify = ["profile", "account"]

def profile() {
    User user = springSecurityService.currentUser

    UserProfile profile = UserProfile.findByUser(user)

    if(profile == null) {
        flash.error="Profile not found."
        return
    }

    [profile: profile, user: user]
}
}

通常のリクエストは期待どおりに機能しますが、ajaxリクエストを試してみると、応答は完全に空になっています。ヘッダーのみが送信されます。

4

2 に答える 2

1

空白を返すajaxリクエストに対してtrueまたはfalseを返します。レンダリング関数を使用してモデルオブジェクトをJSONとして変換するか、モデルオブジェクトをJSONに変換して返す必要があります。アクションが修正されているかどうかを確認する必要はありません。JSONオブジェクトを返すだけです。

于 2012-10-23T05:18:24.023 に答える
1

あなたの後、model.put("layout", "ajax")あなたは戻りたくはありませんfalseが、むしろtrue。戻るfalseと、フィルターが何らかの方法で失敗したことを示し、それ以降のすべての処理が停止します。その結果、空の応答がブラウザーに返されます。を返すtrueと、更新されたモデルは処理チェーンを続行し、gspにレンダリングされます。

于 2012-10-23T13:26:41.807 に答える