11

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を確認しました。テンプレートが引数リストに含まれていない限り、テンプレートのレンダリングは行われません。だから私の唯一の推測は、何かがテンプレートを再びレンダリングしているということです。

4

4 に答える 4

13

解決済み:contentTypeを追加すると、テンプレートがレンダリングされなくなります。

render text: "Name: ${person.name}", contentType: "text/plain"
于 2009-09-25T02:30:11.520 に答える
3

クライアント側のJavaScriptコードでJSON応答を処理し、次のように応答をレンダリングします。

[text: "Name:${person.name}"]をJSONとしてレンダリングします

于 2009-09-24T18:19:56.147 に答える
3

Grailsの「慣例によるレイアウト」機能によってやけどを負う可能性があります。たとえば、レイアウト名がコントローラー名のプレフィックスと一致する場合、Grailsはそのコントローラーによって管理されるすべてのビューにレイアウトを適用します。残念ながら、それはテキストやテンプレートにも適用されます。現在、これに関してログに記録されているJIRAがいくつかあります(たとえば、http: //jira.grails.org/browse/GRAILS-7624を参照してください)。今日はこれでやけどしました。レイアウトgspの名前を変更して、どのコントローラー名とも一致しないようにすることで解決しました。私のレイアウトは当初「storefront.gsp」という名前で、StorefrontControllerという名前のコントローラーがあります。レイアウトの名前を「public.gsp」に変更しました。

于 2011-08-28T19:43:14.387 に答える
0

アクションから明示的にfalseを返すと、これが修正されることがわかりました。

JSONが暗黙的にfalseを返すため、renderfooを実行すると思います。

于 2009-09-23T11:16:39.013 に答える