Grailsコントローラーで、AJAX呼び出しに応答しrender
、テキストを返すために使用しています。
def ajaxRandomPersonName = {
def person = get a random person ...
render "Name: ${person.name}"
}
問題は、render
テンプレート全体をレンダリングすることです。したがって、「名前:ジョン」をレンダリングするだけでなく、テンプレートで定義されているすべてのアイコン、ナビゲーションなどをレンダリングします。render
テンプレートなしでレンダリングするにはどうすればよいですか?
Grails 1.1.1を使用して、「Grails in Action」(28ページ)の第1章をほぼフォローしています。
フォローアップ:Rhysyngsunの提案に従ってfalseを返しても影響はありません。テンプレートをnullに設定しようとしましたが、それでもテンプレートはレンダリングされます。
def ajaxRandomPersonName = {
def person = get a random person ...
render (template:null, text:"Name: ${person.name}")
}
render
私が何をしようとも、テンプレートを通してそれをレンダリングすることに心を向けています。
フォローアップ2:grails-userメーリングリストに関する並行ディスカッション。
フォローアップ3:サンプルコード:コードを最小限にペアリングしましたが、それでも望ましくないテンプレートレンダリングが表示されます。
controllers / PersonController.groovy:
class PersonController {
def index = { }
def home = { [message:"Hello"] }
def ajaxTest = {
println "ajaxTest called"
render text: "ajax message"
}
}
views / person / home.gsp(ホームメソッドのページを表示)
<html>
<head>
<title>Home View</title>
<g:javascript library="prototype" />
</head>
<body>
<p>
<g:remoteLink action="ajaxTest" update="test1">ajax call</g:remoteLink>
</p>
<p>Message = ${message}</p>
<p id="test1">Blank</p>
</body>
</html>
views / layouts / person.gsp(個人コントローラーのレイアウトテンプレート)
<html>
<head>
<title>Test App - <g:layoutTitle/></title>
<g:layoutHead/>
</head>
<body>
<h1>Test App</h1>
<g:layoutBody/>
</body>
</html>
ホームビューで個人コントローラーにアクセスします: http:// localhost:8080 / test / person / home
ページは次のようにレンダリングされます:Test App ajax call(hyperlink)Message = Hello Blank
「テストアプリ」はテンプレートからのものです。「ajaxcall」をクリックすると、PersonControllerのajaxTestメソッド(printlnで確認済み)が非同期で呼び出されます。ajaxTestが行うのは、printlnと静的テキストのレンダリングだけです。この結果、次のようになります。
Test App
ajax call
Message = Hello
Test App
ajax message
テンプレートが「test1」内にレンダリングされていることに注意してください。<p>
これにより、2番目の「テストアプリ」が作成されます。
Grails1.1.1を実行しています。何か案は?コードは単純なようです。Grailsソースをダウンロードして、RenderDynamicMethod.javaを確認しました。テンプレートが引数リストに含まれていない限り、テンプレートのレンダリングは行われません。だから私の唯一の推測は、何かがテンプレートを再びレンダリングしているということです。