JsCmdはどのようにリフトで動作しますか?

私はそれがJavascriptに囲まれたコードをコンパイルすると推定しますが、コードはどのように実行されるのではなくコンパイルされますか?たとえば、 Simply 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))
  }
}
0

2 答え

JsCmdは何もコンパイルも実行もしません。むしろ、ブラウザに送ることができるJavascript文字列を構築するより型保証された形式です。そこで実行される可能性があります。

5
追加された
だから私は質問に追加した例では、どのような種類のJavaScript文字列が生成されますか?
追加された 著者 Robin Green,
それはあなたのコードが束になって複雑になります。基本的に window.location のリダイレクトや関連する要素のさまざまな innerHTML 呼び出しです。
追加された 著者 pr1001,

このようなajaxによって呼び出されるプロセスメソッドの場合、メソッド内のScalaコードは2つの部分に分割できます。

  1. サーバー上で通常どおり実行されるコード。
  2. javascriptに変換されてブラウザに返されるコード

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

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\">
  • wrong title
</div>";});} catch (e) {}
try{jQuery("#title").each(function(i) {
this.innerHTML = "wrong title";});} 
catch (e) {}, 
List((Content-Length,295), (Content-Type,text/javascript; charset=utf-8)), 
List(), 200)

JsCmdの使用例をいくつか見たい場合は、「Exploring Lift」をお勧めします。

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

Btw、Liftの質問については、Stack OverflowではなくLift Googleグループで質問することをおすすめします。それは正式なサポートチャネルであり、コミュニティは非常に敏感です。

1
追加された
サーバー上で寝るのはちょっとばかばかしいようでした。だから、それはクライアントにあったはずだと思っていましたが、今は理解しています。
追加された 著者 Robin Green,