web/laminar

Ajax 호출하기

wefree 2022. 1. 8. 23:05

코드

import com.raquo.airstream.web.AjaxEventStream
import com.raquo.laminar.api.L._
import org.scalajs.dom

object Main {
  def main(args: Array[String]): Unit = {
    val urlVar       = Var("https://api.zippopotam.us/us/90210")
    val otherButton  = button("other url", onClick.mapTo("https://jsonplaceholder.typicode.com/todos/2") --> urlVar)
    val submitButton = button("submit")

    // EventStream.fromFuture(Ajax.get(url = urlVar.now()).map(_.responseText))
    val responseOnClick: EventStream[String] =
      submitButton.events(onClick).flatMap(_ => AjaxEventStream.get(url = urlVar.now()).map(_.responseText))

    val content = div(
      input(
        typ := "text",
        width := "300px",
        controlled(value <-- urlVar.signal, onInput.mapToValue --> urlVar)
      ),
      otherButton,
      submitButton,
      br(),
      label("response: "),
      child.text <-- responseOnClick
    )

    val containerNode = dom.document.getElementById("main_content")
    render(containerNode, content)
  }
}

 

혹은 EventBus 를 사용해 아래처럼 구현할 수도 있다.

import com.raquo.laminar.api.L._
import org.scalajs.dom
import org.scalajs.dom.ext.Ajax

import scala.concurrent.ExecutionContext.Implicits.global

object Main {
  def main(args: Array[String]): Unit = {
    val urlVar      = Var("https://api.zippopotam.us/us/90210")
    val otherButton = button("other url", onClick.mapTo("https://jsonplaceholder.typicode.com/todos/2") --> urlVar)


//    val (responseOnClick, callback)  = EventStream.withCallback[String]
//    val submitButton                      =
//      button("submit", onClick --> (_ => Ajax.get(url = urlVar.now()).map(x => callback(x.responseText))))

    val responseOnClick: EventBus[String] = new EventBus
    val submitButton                      =
      button("submit", onClick --> (_ => Ajax.get(url = urlVar.now()).map(x => responseOnClick.emit(x.responseText))))

    val content = div(
      input(
        typ := "text",
        width := "300px",
        controlled(value <-- urlVar.signal, onInput.mapToValue --> urlVar)
      ),
      otherButton,
      submitButton,
      br(),
      label("response: "),
      child.text <-- responseOnClick
    )

    val containerNode = dom.document.getElementById("main_content")
    render(containerNode, content)
  }
}

 

결과

설명

laminext fetch 를 활용하는 것도 좋을 것 같다.