如何在客户端对已婚的scalajs做出反应和自动装配?

时间:2015-10-22 13:16:23

标签: scala autowired scala.js scalajs-react upickle

我很难将autowire调用与scalajs-react组件混合在一起。以下是使用scalajs-react v0.10.0 + autowire v0.2.5

的简单示例
case class User(name: String)

class Backend($: BackendScope[Unit, User]) {
  def mounted: Callback = {
    val future: Future[User] = AjaxClient[Api].getUser(123).call()
    //FIXME: how to get deal with it?
    CallbackTo { future.foreach(user => $.modState(_ => user)) }
  }
}

val Main = ReactComponentB[Unit]("Main")
  .initialState(User("N/A"))
  .backend(new Backend(_))
  .render { $ =>
    val name = $.state.name
    <.p(s"User name is $name")
  }
  .componentDidMount(_.backend.mounted)
  .buildU

状态修改在这里不起作用。如何合并FutureCallback

更新(2015年10月27日)

我的autowire客户端

package example

import scalajs.concurrent.JSExecutionContext.Implicits.runNow
import org.scalajs.dom

import upickle._
import default._

import scala.concurrent.Future

object AjaxClient extends autowire.Client[Js.Value, Reader, Writer] {
  def write[Result: Writer](r: Result) = default.writeJs(r)
  def read[Result: Reader](p: Js.Value) = default.readJs[Result](p)

  override def doCall(req: Request): Future[Js.Value] = {
    println(req)
    dom.ext.Ajax.post(
      url = "/api/autowire/" + req.path.mkString("/"),
      headers = Map("Content-Type" -> "application/json"),
      data = json.write(Js.Obj(req.args.toSeq :_*))
    ).map(_.responseText)
     .map{t => println(t); t}
     .map(json.read)
  }
}

1 个答案:

答案 0 :(得分:3)

添加一些方法以简化Callback + Future的组合可能会非常有帮助。随意提交公关,甚至提出一个问题,显示其他支持可能有用的例子。

在存在这样的帮助之前,您可以像以下一样在未来调用.runNow() Callback(future.foreach($.setState(_).runNow()))