2011-10-28 10 views
0

私はそれがJavascriptに囲まれたコードをコンパイルすると仮定しますが、コードはどのように実行されるのではなくコンパイルされますか?例えば、からこのコードは単純にリフト:JsCmdはどのようにLiftで動作しますか?

object AjaxExample { 
    def render = { 
    // state 
    var name = "" 
    var age = "0" 
    val whence = S.referer openOr "/" 
​ 
    // our process method returns a 
    // JsCmd which will be sent back to the browser 
    // as part of the response 
    def process(): JsCmd= { 
​ 
     // sleep for 400 millis to allow the user to 
     // see the spinning icon 
     Thread.sleep(400) 

     // do the matching 
     asInt(age) match { 
     // display an error and otherwise do nothing 
     case Full(a) if a < 13 => S.error("age", "Too young!"); Noop 
​ 
     // redirect to the page that the user came from 
     // and display notices on that page 
     case Full(a) => { 
      RedirectTo(whence,() => { 
      S.notice("Name: "+name) 
      S.notice("Age: "+a) 
      }) 
     } 

     // more errors 
     case _ => S.error("age", "Age doesn't parse as a number"); Noop 
     } 
    } 
​ 
    // binding looks normal 
    "name=name" #> SHtml.text(name, name = _, "id" -> "the_name") & 
    "name=age" #> (SHtml.text(age, age = _) ++ SHtml.hidden(process)) 
    } 
} 

答えて

5

JsCmdがコンパイルまたは何も実行しません。むしろ、ブラウザに送ることができるJavascript文字列を構築するより型保証された形式です。そこで実行される可能性があります。 AJAXによって起動されようとしているこのような任意の処理方法について

+0

私はこの質問にどのような種類のJavaScript文字列を組み込みますか? –

+1

これは、あなたのコードが束になっているので複雑です。基本的に 'window.location'リダイレクトや、関連する要素に対するさまざまな' innerHTML'呼び出しです。 – pr1001

1

、方法でScalaのコードは、2つの部分に分けることができる:サーバ上で通常どおり実行される

  1. コード。
  2. javascriptに変換されてブラウザに返されるコード。

javascriptに変換されるコードは、メソッドシグネチャからわかるように、メソッドから返されたコードだけです。これは、Lift JsCmdオブジェクトです。この特定の例では、processメソッドの戻り値は、さまざまなcase文の戻り値です。最初のcase文はS.errorを呼び出し、2番目のcase文はS.noticeを呼び出し、3番目のcase文はS.errorを呼び出します。これは、javascriptに変換されてブラウザに戻されるものです。実際のjavascriptを見たい場合は、Liftによって記録されます。例えば私は、「タイトル」属性を持つフォームを持っていると私は(「タイトル」、「間違ったタイトル」)S.errorを呼び出すことによって、エラーを報告する場合は、その後、私のログは示しています

13:32:32.841 [[email protected]] DEBUG comet_trace - AJAX Response: 
8b5ruvtezi521nbful5n7s3cp 
InMemoryResponse(try{jQuery("#lift__noticesContainer__").each(function(i) 
{this.innerHTML = "<div id=\"lift__noticesContainer___error\"><ul> 
<li>wrong title</li> 
</ul></div>";});} catch (e) {} 
try{jQuery("#title").each(function(i) { 
this.innerHTML = "<span id=\"title\">wrong title</span>";});} 
catch (e) {}, 
List((Content-Length,295), (Content-Type,text/javascript; charset=utf-8)), 
List(), 200) 

あなたが見てみたい場合はJsCmdを使用してのいくつかのより多くの例は、私が「リフトを探る」をお勧めしたい:

http://exploring.liftweb.net/master/index-11.html

ところで、私はむしろ、スタックオーバーフローよりもリフトGoogleのグループに尋ねお勧めリフトの質問について。それは正式なサポートチャネルであり、コミュニティは非常に敏感です。

+0

OK、サーバ上で眠るのはちょっとばかばかしいようでしたので、私はそれがクライアント上にあったはずだと思っていましたが、今は理解しています。 –

関連する問題