2010-11-30 13 views
1

私はコントローラ持っている:あなたは、私はのparam nameコントローラから外部の.jsファイルへのGrails.passパラメータ?

を渡す見るように私の見解ページ

package plugin 

class TestController { 

def simply = {[name:new Date()]} 
} 

を:

<html> 
<head> 
<!-- <script type="text/javascript" src="${resource(dir:'resource/js',file:'simply.js')}?color=FA8DFF">--> 

<g:javascript> 
    alert("${name}") 
</g:javascript> 
</head> 
<body> 
</body> 
</html> 

このページの実行正しい - 負荷afrer私は、現在の日付と警告ウィンドウを参照してください。 )

ただし、

ビューページ:

<html> 
<head> 
<script type="text/javascript" src="${resource(dir:'resource/js',file:'simply.js')}?color=FA8DF"> 
</script> 
</head> 
<body> 
</body> 
</html> 

と外部simply.jsファイル:

alert("${name}") 

私は空の警告ウィンドウが表示されます。だから、私の質問:私はexternal.jsファイルにparamsを渡すことができますか?

答えて

4

ビューがユーザーに表示されるときに、ビューの解析に2つの段階があります。状態1は、ビューページに含まれるコードを実行しているサーバーです。あなたの場合

${name} 

これはコントローラの値なので、現在の日付になります。つまり、ユーザーのブラウザに送信されるテキストには、$ {name}の代わりに2010年3月2日が含まれます。

ユーザーがビューにアクセスするときに発生する第2段階は、HTMLを解析するブラウザです。ブラウザーに送信されるHTMLは、サーバーで何が行われたかによって異なります。あなたの例ではJavaScriptがビューに含まれているので、$ {name}はサーバ上の現在の日付に置き換えられます。 2010年3月3日を含むJavaScriptは、サーバー上で$ {name}が2010年3月3日に置き換えられてからブラウザに送信されます。つまり、ポップアップボックスには2010年3月3日が含まれます。外部のJavaScriptファイルをインクルードすると、ブラウザが直接それらをダウンロードしてからサーバーに要求しないため、最初のステップを実行することはありません。つまり、最初のステップは決して行われないので、$ [name]はコントローラからの値に置き換えられません。この現象は、

<script> 

または

<g:javascript> 

タグを使用して同じ天気です。 ビューからの値を外部ファイルにあるJavaScriptに渡すには、パラメータを渡す場合はJavaScriptを外部ファイルの関数として定義する必要があります。あなたのビューからexternal.jsその後

Function dispDate(theParam) 
{ 
Alert(theParam); 
} 

で例えばexternal.jsがウェブアプリの/ jsのディレクトリに格納されている

<g:javascript src="external.js" /> 
<script type="text/JavaScript"> 
dispDate(“${name}”); 
</script> 

+0

すごい、素晴らしい方法です! Grails自身が外部ファイルをレンダリングすることになります – user471011

関連する問題