2012-03-19 18 views
0

ドメインモデル(A)の編集を処理するフォームがあります。このドメインモデルもhasMany他のドメインモデル(B)。したがって、Aに新しいBsを追加するには、カスタムAJAX関数を実装して、いくつかの入力フィールドのパラメータをコントローラに送信したかったのです。外部Javascriptファイルのコントローラ/アクションへのURL

そうするためには、私は次のGSP作成しました:

<g:form> 
<!-- other stuff concerning entity A --> 
    <p>Add B to A</p> 
    <input type="text" id="bName" /> <input type="text" id="bSomeProperty" <a href="#" id="addB">Add</a> 
</g:form> 

をそしてresourcesプラグインによってロードされている私のmain.jsへのJavascriptの以下の部分を追加しました。

$("#addB").click(function() { 
    $.ajax({ 
     url: '', // controller: a, action: addB 
     dataType: 'json', 
     data: { 
      bName: $('#bName').val(), 
      bSomeProperty: $('#bSomeProperty').val(), 
     } 
    }); 
}); 

だから、質問は:どのように私は、現在のコントローラとアクションaddBを指すURLを取得することができますか? Grailsは実際にはリンクを取得するためのメソッドを提供しているので、ハードコーディングや相対パスを使用したくはありません。

javascriptでremoteFunctionを使用するとjQueryが使用されていたため、私にとってはうまくいかなかった。どちらもうまく機能していないようです。

Grails、jQuery、AJAXについてのこのブログ記事(http://alexduan.com/2011/02/17/grails-jquery-and-ajax/)も見つかりました。彼はjavascriptの部分で変数を使います。残念ながら、contextPath変数は解析されません.JavascriptはGSPページ内ではなく外部ファイルにあるためです。

どうすればよいですか?

オプション:

  • (それは多少インラインなので、多少醜い)ページ内g:javascriptタグでJavascriptのピースを入れ
  • (非常に堅牢ではない)は、相対URLを使用remoteFunctionを取得(jQueryのやり方は?)
  • 他に何か?

答えて

0

私は私のプロジェクトでは、あなたの最初のオプションを使用します。私はjavascriptオブジェクトグローバルmyapp.urlsにすべての私のマッピングのサブセットをロードし、その結果、

myapp.urls['mappingName'] = url 

2の問題が発生する:

  • 公開すると公開するURLを選択する必要があります。

  • ウェブクロール(GoogleBotなど)はfこのためにrobots.txtを作成していない場合は、これらのリンクをollowしてください。

    myapp.urls=eval(base64_decode('gYW55IGNhcm5hbCBwbGVhc3VyZS4==')); 
    

    それは完璧ではないのですが、それは動作します:私はこのように見て何かを得るだから私は、インライン呼び出しを-base64エンコードこのソリューションを強化する

+0

ありがとうございます!私は 'main.gsp'にグローバル変数を追加したので、他のすべてのJavascriptファイルで' contextPath'にアクセスし、コントローラとアクションへのパスを自分で構築することができます。 –

関連する問題