Как работает JsCmd в Lift? - PullRequest
       5

Как работает JsCmd в Lift?

0 голосов
/ 28 октября 2011

Я предполагаю, что он компилирует прилагаемый код в 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))
  }
}

Ответы [ 2 ]

5 голосов
/ 28 октября 2011

JsCmd не компилирует и не выполняет ничего. Скорее, это более безопасная для типов форма построения строк Javascript, которые можно отправлять в браузер, где они могут быть выполнены.

1 голос
/ 31 марта 2012

Для любого метода процесса, подобного этому, который будет вызываться ajax, код Scala в методе можно разделить на две части:

  1. Код, который будет выполняться на сервере как обычно.
  2. Код, который будет преобразован в javascript и отправлен обратно в браузер.

Единственный код, который будет преобразован в javascript, - это код, возвращаемый методом, который, какКак видно из сигнатуры метода, это объект Lift JsCmd.В этом конкретном примере возвращаемые значения из метода процесса являются возвращаемыми значениями из различных операторов case.Первый оператор case вызывает S.error, второй - S.notice, а третий - S.error.Именно они будут преобразованы в javascript для отправки обратно в браузер.Если вы хотите увидеть настоящий javascript, он будет зарегистрирован в Lift.например, если у меня есть форма с атрибутом «title», и я сообщаю об ошибке, вызывая S.error («title», «неправильный заголовок»), то мой журнал показывает:

13:32:32.841 [291876857@qtp-349619216-4] 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, я бы порекомендовал "Exploring Lift":

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

Кстати, для вопросов Lift я бы порекомендовал задавать вопросы в группе Google Liftа не переполнение стека.Это официальный канал поддержки, и сообщество очень отзывчиво.

...